Index: .clang-format
===================================================================
--- .clang-format	(revision 14628)
+++ .clang-format	(working copy)
@@ -81,8 +81,8 @@
 #JavaScriptQuotes
 #JavaScriptWrapImports
 KeepEmptyLinesAtTheStartOfBlocks: true
-MacroBlockBegin: '^BEGIN_MESSAGE_MAP$' #?
-MacroBlockEnd: '^END_MESSAGE_MAP$' #?
+MacroBlockBegin: '^MPT_TEST_GROUP_BEGIN|BEGIN_MESSAGE_MAP$' #?
+MacroBlockEnd: '^MPT_TEST_GROUP_END|END_MESSAGE_MAP$' #?
 MaxEmptyLinesToKeep: 5
 NamespaceIndentation: None
 NamespaceMacros: [] #?
Index: build/android_ndk/Android.mk
===================================================================
--- build/android_ndk/Android.mk	(revision 14628)
+++ build/android_ndk/Android.mk	(working copy)
@@ -11,7 +11,7 @@
 
 LOCAL_CPP_FEATURES += exceptions rtti
 
-LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/common $(LOCAL_PATH)/build/svn_version
+LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/src $(LOCAL_PATH)/common $(LOCAL_PATH)/build/svn_version
 
 LOCAL_CFLAGS   += -fvisibility=hidden -Wall -DLIBOPENMPT_BUILD -DMPT_WITH_ZLIB
 LOCAL_CPPFLAGS +=#-fvisibility=hidden -Wall -DLIBOPENMPT_BUILD -DMPT_WITH_ZLIB
Index: build/autotools/Makefile.am
===================================================================
--- build/autotools/Makefile.am	(revision 14628)
+++ build/autotools/Makefile.am	(working copy)
@@ -109,6 +109,109 @@
 pkgconfig_DATA = 
 nobase_include_HEADERS = 
 
+MPT_FILES_SRC_MPT = 
+MPT_FILES_SRC_MPT += src/mpt/base/algorithm.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/alloc.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/arithmetic_shift.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/array.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/bit.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/check_platform.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/compiletime_warning.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/constexpr_throw.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/detect.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/detect_compiler.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/detect_libc.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/detect_libcxx.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/detect_os.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/detect_quirks.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/floatingpoint.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/integer.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/macros.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/math.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/memory.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/namespace.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/numeric.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/pointer.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/preprocessor.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/saturate_cast.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/saturate_round.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/secure.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/semantic_version.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/source_location.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/span.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/utility.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/version.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/wrapping_divide.hpp
+MPT_FILES_SRC_MPT += src/mpt/binary/base64.hpp
+MPT_FILES_SRC_MPT += src/mpt/binary/base64url.hpp
+MPT_FILES_SRC_MPT += src/mpt/binary/hex.hpp
+MPT_FILES_SRC_MPT += src/mpt/check/libc.hpp
+MPT_FILES_SRC_MPT += src/mpt/check/mfc.hpp
+MPT_FILES_SRC_MPT += src/mpt/check/windows.hpp
+MPT_FILES_SRC_MPT += src/mpt/crc/crc.hpp
+#MPT_FILES_SRC_MPT += src/mpt/crypto/exception.hpp
+#MPT_FILES_SRC_MPT += src/mpt/crypto/hash.hpp
+#MPT_FILES_SRC_MPT += src/mpt/crypto/jwk.hpp
+MPT_FILES_SRC_MPT += src/mpt/detect/mfc.hpp
+MPT_FILES_SRC_MPT += src/mpt/detect/nlohmann_json.hpp
+MPT_FILES_SRC_MPT += src/mpt/endian/floatingpoint.hpp
+MPT_FILES_SRC_MPT += src/mpt/endian/integer.hpp
+MPT_FILES_SRC_MPT += src/mpt/environment/environment.hpp
+MPT_FILES_SRC_MPT += src/mpt/exception_text/exception_text.hpp
+#MPT_FILES_SRC_MPT += src/mpt/json/json.hpp
+MPT_FILES_SRC_MPT += src/mpt/mutex/mutex.hpp
+MPT_FILES_SRC_MPT += src/mpt/osinfo/windows_version.hpp
+MPT_FILES_SRC_MPT += src/mpt/out_of_memory/out_of_memory.hpp
+MPT_FILES_SRC_MPT += src/mpt/random/crand.hpp
+MPT_FILES_SRC_MPT += src/mpt/random/default_engines.hpp
+MPT_FILES_SRC_MPT += src/mpt/random/device.hpp
+MPT_FILES_SRC_MPT += src/mpt/random/engine.hpp
+MPT_FILES_SRC_MPT += src/mpt/random/engine_lcg.hpp
+MPT_FILES_SRC_MPT += src/mpt/random/random.hpp
+MPT_FILES_SRC_MPT += src/mpt/random/seed.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/buffer.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/convert.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/convert_macros.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_default_floatingpoint.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_default_formatter.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_default_integer.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_default_string.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_helpers.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_message.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_message_macros.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_simple.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_simple_floatingpoint.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_simple_integer.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/format_simple_spec.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/parse.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/types.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/utility.hpp
+MPT_FILES_SRC_MPT += src/mpt/system_error/system_error.hpp
+MPT_FILES_SRC_MPT += src/mpt/test/test.hpp
+MPT_FILES_SRC_MPT += src/mpt/test/test_macros.hpp
+MPT_FILES_SRC_MPT += src/mpt/uuid/guid.hpp
+MPT_FILES_SRC_MPT += src/mpt/uuid/uuid.hpp
+#MPT_FILES_SRC_MPT += src/mpt/uuid_namespace/uuid_namespace.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/tests/tests_base_arithmetic_shift.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/tests/tests_base_bit.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/tests/tests_base_math.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/tests/tests_base_saturate_cast.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/tests/tests_base_saturate_round.hpp
+MPT_FILES_SRC_MPT += src/mpt/base/tests/tests_base_wrapping_divide.hpp
+MPT_FILES_SRC_MPT += src/mpt/binary/tests/tests_binary.hpp
+MPT_FILES_SRC_MPT += src/mpt/crc/tests/tests_crc.hpp
+#MPT_FILES_SRC_MPT += src/mpt/crypto/tests/tests_crypto.hpp
+MPT_FILES_SRC_MPT += src/mpt/endian/tests/tests_endian_floatingpoint.hpp
+MPT_FILES_SRC_MPT += src/mpt/endian/tests/tests_endian_integer.hpp
+MPT_FILES_SRC_MPT += src/mpt/random/tests/tests_random.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/tests/tests_string_buffer.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/tests/tests_string_convert.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/tests/tests_string_format_message.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/tests/tests_string_format_simple.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/tests/tests_string_parse.hpp
+MPT_FILES_SRC_MPT += src/mpt/string/tests/tests_string_utility.hpp
+MPT_FILES_SRC_MPT += src/mpt/uuid/tests/tests_uuid.hpp
+#MPT_FILES_SRC_MPT += src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
 MPT_FILES_COMMON = 
 MPT_FILES_COMMON += common/BuildSettings.h
 MPT_FILES_COMMON += common/CompilerDetect.h
@@ -379,12 +482,13 @@
 nobase_include_HEADERS += libopenmpt/libopenmpt_stream_callbacks_file.h
 nobase_include_HEADERS += libopenmpt/libopenmpt_ext.h
 nobase_include_HEADERS += libopenmpt/libopenmpt_ext.hpp
-libopenmpt_la_CPPFLAGS = $(MINGWSTDTHREADS_CPPFLAGS) -DLIBOPENMPT_BUILD -I$(srcdir)/build/svn_version -I$(srcdir)/ -I$(srcdir)/common $(ZLIB_CFLAGS) $(MPG123_CFLAGS) $(OGG_CFLAGS) $(VORBIS_CFLAGS) $(VORBISFILE_CFLAGS)
+libopenmpt_la_CPPFLAGS = $(MINGWSTDTHREADS_CPPFLAGS) -DLIBOPENMPT_BUILD -I$(srcdir)/build/svn_version -I$(srcdir)/ -I$(srcdir)/src -I$(srcdir)/common $(ZLIB_CFLAGS) $(MPG123_CFLAGS) $(OGG_CFLAGS) $(VORBIS_CFLAGS) $(VORBISFILE_CFLAGS)
 libopenmpt_la_CXXFLAGS = $(ZLIB_CFLAGS) $(MPG123_CFLAGS) $(OGG_CFLAGS) $(VORBIS_CFLAGS) $(VORBISFILE_CFLAGS)
 libopenmpt_la_CFLAGS = $(ZLIB_CFLAGS) $(MPG123_CFLAGS) $(OGG_CFLAGS) $(VORBIS_CFLAGS) $(VORBISFILE_CFLAGS)
 libopenmpt_la_LIBADD = $(ZLIB_LIBS) $(MPG123_LIBS) $(OGG_LIBS) $(VORBIS_LIBS) $(VORBISFILE_LIBS) $(LIBOPENMPT_WIN32_LIBS)
 libopenmpt_la_SOURCES = 
 libopenmpt_la_SOURCES += build/svn_version/svn_version.h
+libopenmpt_la_SOURCES += $(MPT_FILES_SRC_MPT)
 libopenmpt_la_SOURCES += $(MPT_FILES_COMMON)
 libopenmpt_la_SOURCES += $(MPT_FILES_SOUNDBASE)
 libopenmpt_la_SOURCES += $(MPT_FILES_SOUNDLIB)
@@ -408,12 +512,21 @@
 
 if ENABLE_TESTS
 check_PROGRAMS += libopenmpttest
-libopenmpttest_CPPFLAGS = $(MINGWSTDTHREADS_CPPFLAGS) -DLIBOPENMPT_BUILD -DLIBOPENMPT_BUILD_TEST -I$(srcdir)/build/svn_version -I$(srcdir)/ -I$(srcdir)/common $(ZLIB_CFLAGS) $(MPG123_CFLAGS) $(OGG_CFLAGS) $(VORBIS_CFLAGS) $(VORBISFILE_CFLAGS)
+libopenmpttest_CPPFLAGS = $(MINGWSTDTHREADS_CPPFLAGS) -DLIBOPENMPT_BUILD -DLIBOPENMPT_BUILD_TEST -I$(srcdir)/build/svn_version -I$(srcdir)/ -I$(srcdir)/src -I$(srcdir)/common $(ZLIB_CFLAGS) $(MPG123_CFLAGS) $(OGG_CFLAGS) $(VORBIS_CFLAGS) $(VORBISFILE_CFLAGS)
 libopenmpttest_CXXFLAGS = $(ZLIB_CFLAGS) $(MPG123_CFLAGS) $(OGG_CFLAGS) $(VORBIS_CFLAGS) $(VORBISFILE_CFLAGS) $(WIN32_CONSOLE_CXXFLAGS)
 libopenmpttest_CFLAGS = $(ZLIB_CFLAGS) $(MPG123_CFLAGS) $(OGG_CFLAGS) $(VORBIS_CFLAGS) $(VORBISFILE_CFLAGS) $(WIN32_CONSOLE_CFLAGS)
 libopenmpttest_LDADD = $(ZLIB_LIBS) $(MPG123_LIBS) $(OGG_LIBS) $(VORBIS_LIBS) $(VORBISFILE_LIBS) $(LIBOPENMPT_WIN32_LIB)
 libopenmpttest_SOURCES = 
 libopenmpttest_SOURCES += libopenmpt/libopenmpt_test.cpp
+libopenmpttest_SOURCES += test/mpt_tests_base.cpp
+libopenmpttest_SOURCES += test/mpt_tests_binary.cpp
+libopenmpttest_SOURCES += test/mpt_tests_crc.cpp
+#libopenmpttest_SOURCES += test/mpt_tests_crypto.cpp
+libopenmpttest_SOURCES += test/mpt_tests_endian.cpp
+libopenmpttest_SOURCES += test/mpt_tests_random.cpp
+libopenmpttest_SOURCES += test/mpt_tests_string.cpp
+libopenmpttest_SOURCES += test/mpt_tests_uuid.cpp
+#libopenmpttest_SOURCES += test/mpt_tests_uuid_namespace.cpp
 libopenmpttest_SOURCES += test/test.cpp
 libopenmpttest_SOURCES += test/test.h
 libopenmpttest_SOURCES += test/TestTools.h
@@ -421,6 +534,7 @@
 libopenmpttest_SOURCES += test/TestToolsLib.h
 libopenmpttest_SOURCES += test/TestToolsTracker.h
 libopenmpttest_SOURCES += build/svn_version/svn_version.h
+libopenmpttest_SOURCES += $(MPT_FILES_SRC_MPT)
 libopenmpttest_SOURCES += $(MPT_FILES_COMMON)
 libopenmpttest_SOURCES += $(MPT_FILES_SOUNDBASE)
 libopenmpttest_SOURCES += $(MPT_FILES_SOUNDLIB)
@@ -446,10 +560,11 @@
 if ENABLE_OPENMPT123
 
 bin_PROGRAMS += bin/openmpt123
-bin_openmpt123_CPPFLAGS = $(MINGWSTDTHREADS_CPPFLAGS) $(PORTAUDIO_CFLAGS) $(PULSEAUDIO_CFLAGS) $(SDL2_CFLAGS) $(SNDFILE_CFLAGS) $(FLAC_CFLAGS)
+bin_openmpt123_CPPFLAGS = $(MINGWSTDTHREADS_CPPFLAGS) -I$(srcdir)/src $(PORTAUDIO_CFLAGS) $(PULSEAUDIO_CFLAGS) $(SDL2_CFLAGS) $(SNDFILE_CFLAGS) $(FLAC_CFLAGS)
 bin_openmpt123_CXXFLAGS = $(WIN32_CONSOLE_CXXFLAGS)
 bin_openmpt123_LDADD = libopenmpt.la $(PORTAUDIO_LIBS) $(PULSEAUDIO_LIBS) $(SDL2_LIBS) $(SNDFILE_LIBS) $(FLAC_LIBS) $(OPENMPT123_WIN32_LIBS)
 bin_openmpt123_SOURCES = 
+bin_openmpt123_SOURCES += $(MPT_FILES_SRC_MPT)
 bin_openmpt123_SOURCES += openmpt123/openmpt123_allegro42.hpp
 bin_openmpt123_SOURCES += openmpt123/openmpt123_config.hpp
 bin_openmpt123_SOURCES += openmpt123/openmpt123.cpp
Index: build/genie/mpt-libopenmpt.lua
===================================================================
--- build/genie/mpt-libopenmpt.lua	(revision 14628)
+++ build/genie/mpt-libopenmpt.lua	(working copy)
@@ -18,6 +18,7 @@
   includedirs ( extincludedirs )
   includedirs {
    "../..",
+   "../../src",
    "../../common",
    "../../soundlib",
    "$(IntDir)/svn_version",
@@ -24,6 +25,8 @@
    "../../build/svn_version",
   }
   files {
+   "../../src/mpt/**.cpp",
+   "../../src/mpt/**.hpp",
    "../../common/*.cpp",
    "../../common/*.h",
    "../../soundbase/*.cpp",
@@ -53,6 +56,16 @@
    "../../libopenmpt/libopenmpt_ext_impl.cpp",
    "../../libopenmpt/libopenmpt_impl.cpp",
   }
+	excludes {
+		"../../src/mpt/crypto/**.cpp",
+		"../../src/mpt/crypto/**.hpp",
+		"../../src/mpt/json/**.cpp",
+		"../../src/mpt/json/**.hpp",
+		"../../src/mpt/test/**.cpp",
+		"../../src/mpt/test/**.hpp",
+		"../../src/mpt/uuid_namespace/**.cpp",
+		"../../src/mpt/uuid_namespace/**.hpp",
+	}
 	resdefines {
 		"MPT_BUILD_VER_FILENAME=\"" .. mpt_projectname .. ".dll\"",
 		"MPT_BUILD_VER_FILEDESC=\"" .. mpt_projectname .. "\"",
Index: build/premake/mpt-libopenmpt-small.lua
===================================================================
--- build/premake/mpt-libopenmpt-small.lua	(revision 14628)
+++ build/premake/mpt-libopenmpt-small.lua	(working copy)
@@ -17,6 +17,7 @@
 	filter {}
   includedirs {
    "../..",
+   "../../src",
    "../../common",
    "../../soundlib",
    "$(IntDir)/svn_version",
@@ -23,6 +24,8 @@
    "../../build/svn_version",
   }
   files {
+   "../../src/mpt/**.cpp",
+   "../../src/mpt/**.hpp",
    "../../common/*.cpp",
    "../../common/*.h",
    "../../soundbase/*.cpp",
@@ -52,7 +55,16 @@
    "../../libopenmpt/libopenmpt_ext_impl.cpp",
    "../../libopenmpt/libopenmpt_impl.cpp",
   }
-
+	excludes {
+		"../../src/mpt/crypto/**.cpp",
+		"../../src/mpt/crypto/**.hpp",
+		"../../src/mpt/json/**.cpp",
+		"../../src/mpt/json/**.hpp",
+		"../../src/mpt/test/**.cpp",
+		"../../src/mpt/test/**.hpp",
+		"../../src/mpt/uuid_namespace/**.cpp",
+		"../../src/mpt/uuid_namespace/**.hpp",
+	}
 	filter { "action:vs*" }
 		resdefines {
 			"MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\"",
Index: build/premake/mpt-libopenmpt.lua
===================================================================
--- build/premake/mpt-libopenmpt.lua	(revision 14628)
+++ build/premake/mpt-libopenmpt.lua	(working copy)
@@ -22,6 +22,7 @@
   filter {}
   includedirs {
    "../..",
+   "../../src",
    "../../common",
    "../../soundlib",
    "$(IntDir)/svn_version",
@@ -28,6 +29,8 @@
    "../../build/svn_version",
   }
   files {
+   "../../src/mpt/**.cpp",
+   "../../src/mpt/**.hpp",
    "../../common/*.cpp",
    "../../common/*.h",
    "../../soundbase/*.cpp",
@@ -57,7 +60,16 @@
    "../../libopenmpt/libopenmpt_ext_impl.cpp",
    "../../libopenmpt/libopenmpt_impl.cpp",
   }
-
+	excludes {
+		"../../src/mpt/crypto/**.cpp",
+		"../../src/mpt/crypto/**.hpp",
+		"../../src/mpt/json/**.cpp",
+		"../../src/mpt/json/**.hpp",
+		"../../src/mpt/test/**.cpp",
+		"../../src/mpt/test/**.hpp",
+		"../../src/mpt/uuid_namespace/**.cpp",
+		"../../src/mpt/uuid_namespace/**.hpp",
+	}
 	filter { "action:vs*", "kind:SharedLib or ConsoleApp or WindowedApp" }
 		resdefines {
 			"MPT_BUILD_VER_FILENAME=\"" .. mpt_projectname .. ".dll\"",
Index: build/premake/mpt-libopenmpt_test.lua
===================================================================
--- build/premake/mpt-libopenmpt_test.lua	(revision 14628)
+++ build/premake/mpt-libopenmpt_test.lua	(working copy)
@@ -22,6 +22,7 @@
 	filter {}
   includedirs {
    "../..",
+   "../../src",
    "../../common",
    "../../soundlib",
    "$(IntDir)/svn_version",
@@ -28,6 +29,8 @@
    "../../build/svn_version",
   }
   files {
+   "../../src/mpt/**.cpp",
+   "../../src/mpt/**.hpp",
    "../../common/*.cpp",
    "../../common/*.h",
    "../../soundbase/*.cpp",
@@ -60,6 +63,14 @@
    "../../libopenmpt/libopenmpt_impl.cpp",
    "../../libopenmpt/libopenmpt_test.cpp",
   }
+	excludes {
+		"../../src/mpt/crypto/**.cpp",
+		"../../src/mpt/crypto/**.hpp",
+		"../../src/mpt/json/**.cpp",
+		"../../src/mpt/json/**.hpp",
+		"../../src/mpt/uuid_namespace/**.cpp",
+		"../../src/mpt/uuid_namespace/**.hpp",
+	}
   characterset "Unicode"
   warnings "Extra"
   defines { "LIBOPENMPT_BUILD", "LIBOPENMPT_BUILD_TEST" }
Index: build/premake/mpt-OpenMPT.lua
===================================================================
--- build/premake/mpt-OpenMPT.lua	(revision 14628)
+++ build/premake/mpt-OpenMPT.lua	(working copy)
@@ -52,6 +52,7 @@
 		sysincludedirs ( extincludedirs )
 	filter {}
   includedirs {
+   "../../src",
    "../../common",
    "../../soundlib",
    "$(IntDir)/svn_version",
@@ -76,6 +77,8 @@
 		}
 	end
   files {
+   "../../src/mpt/**.cpp",
+   "../../src/mpt/**.hpp",
    "../../common/*.cpp",
    "../../common/*.h",
    "../../soundbase/*.cpp",
@@ -200,6 +203,7 @@
   dofile "../../build/premake/premake-defaults-DLL.lua"
   dofile "../../build/premake/premake-defaults.lua"
   includedirs {
+   "../../src",
    "../../common",
    "../../include",
    "../../include/asiomodern/include",
@@ -212,6 +216,8 @@
   }
   files {
    "../../include/asiomodern/include/ASIOModern/*.hpp",
+   "../../src/mpt/**.cpp",
+   "../../src/mpt/**.hpp",
    "../../common/*.cpp",
    "../../common/*.h",
    "../../soundbase/*.cpp",
@@ -246,6 +252,7 @@
   dofile "../../build/premake/premake-defaults-DLL.lua"
   dofile "../../build/premake/premake-defaults.lua"
   includedirs {
+   "../../src",
    "../../common",
    "../../include",
    "$(IntDir)/svn_version",
Index: build/premake/mpt-openmpt123.lua
===================================================================
--- build/premake/mpt-openmpt123.lua	(revision 14628)
+++ build/premake/mpt-openmpt123.lua	(working copy)
@@ -3,7 +3,7 @@
   uuid "2879F62E-9E2F-4EAB-AE7D-F60C194DD5CB"
   language "C++"
   location ( "../../build/" .. mpt_projectpathname )
-  vpaths { ["*"] = "../../openmpt123/" }
+  vpaths { ["*"] = "../../" }
   mpt_projectname = "openmpt123"
   dofile "../../build/premake/premake-defaults-EXE.lua"
   dofile "../../build/premake/premake-defaults.lua"
@@ -10,6 +10,7 @@
   warnings "Extra"
   local extincludedirs = {
    "../..",
+   "../../src",
    "../../include/flac/include",
    "../../include/portaudio/include",
   }
@@ -25,6 +26,9 @@
    "../../build/svn_version",
   }
   files {
+   "../../src/mpt/base/*.hpp",
+   "../../src/mpt/detect/*.hpp",
+   "../../src/mpt/string/*.hpp",
    "../../openmpt123/*.cpp",
    "../../openmpt123/*.hpp",
   }
Index: build/premake/mpt-PluginBridge.lua
===================================================================
--- build/premake/mpt-PluginBridge.lua	(revision 14628)
+++ build/premake/mpt-PluginBridge.lua	(working copy)
@@ -15,11 +15,14 @@
 		sysincludedirs ( extincludedirs )
 	filter {}
   includedirs {
+   "../../src",
    "../../common",
    "$(IntDir)/svn_version",
    "../../build/svn_version",
   }
   files {
+   "../../src/mpt/**.cpp",
+   "../../src/mpt/**.hpp",
    "../../pluginBridge/AEffectWrapper.h",
    "../../pluginBridge/Bridge.cpp",
    "../../pluginBridge/Bridge.h",
@@ -75,11 +78,14 @@
 		sysincludedirs ( extincludedirs )
 	filter {}
   includedirs {
+   "../../src",
    "../../common",
    "$(IntDir)/svn_version",
    "../../build/svn_version",
   }
   files {
+   "../../src/mpt/**.cpp",
+   "../../src/mpt/**.hpp",
    "../../pluginBridge/AEffectWrapper.h",
    "../../pluginBridge/Bridge.cpp",
    "../../pluginBridge/Bridge.h",
Index: build/premake/mpt-signtool.lua
===================================================================
--- build/premake/mpt-signtool.lua	(revision 14628)
+++ build/premake/mpt-signtool.lua	(working copy)
@@ -8,6 +8,7 @@
   dofile "../../build/premake/premake-defaults-EXE.lua"
   dofile "../../build/premake/premake-defaults.lua"
   includedirs {
+   "../../src",
    "../../common",
    "../../include",
    "../../include/nlohmann-json/include",
@@ -15,6 +16,8 @@
    "../../build/svn_version",
   }
   files {
+   "../../src/mpt/**.cpp",
+   "../../src/mpt/**.hpp",
    "../../common/*.cpp",
    "../../common/*.h",
    "../../misc/*.cpp",
Index: build/svn/run_clang-format.sh
===================================================================
--- build/svn/run_clang-format.sh	(revision 14628)
+++ build/svn/run_clang-format.sh	(working copy)
@@ -12,7 +12,10 @@
 #cd openmpt123
 #	clang-format-11 -i *.hpp *.cpp
 #cd ..
-
 cd soundbase
 	clang-format-11 -i *.h
 cd ..
+
+cd src/mpt
+	find . -type f -iname '*hpp' | xargs clang-format-10 -i
+cd ..
Index: build/vs2017uwp/libopenmpt.vcxproj
===================================================================
--- build/vs2017uwp/libopenmpt.vcxproj	(revision 14628)
+++ build/vs2017uwp/libopenmpt.vcxproj	(working copy)
@@ -286,7 +286,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -302,7 +302,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -321,7 +321,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -337,7 +337,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -356,7 +356,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -372,7 +372,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -390,7 +390,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -407,7 +407,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -428,7 +428,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -445,7 +445,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -466,7 +466,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -483,7 +483,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -503,7 +503,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -519,7 +519,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -538,7 +538,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -554,7 +554,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -573,7 +573,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -589,7 +589,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -607,7 +607,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -624,7 +624,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -645,7 +645,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -662,7 +662,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -683,7 +683,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -700,7 +700,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -717,6 +717,126 @@
     </PreBuildEvent>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
     <ClInclude Include="..\..\common\BuildSettings.h" />
     <ClInclude Include="..\..\common\CompilerDetect.h" />
     <ClInclude Include="..\..\common\ComponentManager.h" />
Index: build/vs2017uwp/libopenmpt.vcxproj.filters
===================================================================
--- build/vs2017uwp/libopenmpt.vcxproj.filters	(revision 14628)
+++ build/vs2017uwp/libopenmpt.vcxproj.filters	(working copy)
@@ -1,6 +1,96 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{1ACB48A9-86AA-C744-8FC2-521BFB202EA6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{B102DE80-9D65-6D25-46EB-A5DB322D39A8}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{A092E23B-8C76-A391-F5D6-9DE4E1D98D13}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{3B77F730-2745-EB36-10D9-5B5DFC45C79B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{AAC627BD-9655-B186-3F74-C5812BE2C12C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{940CB49C-00CD-2FD3-C907-7950358774AF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{2EEFC068-9AA4-395E-2399-33358F4D3062}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{DD28764B-493F-74E1-92B6-FF02FE0B4569}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{97C4F533-8392-E939-6C26-5A605893C59E}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{06A9D974-F237-633E-9B56-773987C473E4}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{CFBF5C35-BB8D-503B-A421-C161908E2CA0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{A50F4C38-91DD-3F3E-7A71-B06466DE1BA3}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{94862B67-8015-B530-2934-C92B15A2C5D6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{4BCBC71D-B72C-A52B-409A-EBDDACFADBEA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{C9C6093D-B5C0-328F-9E2D-C99F8AC698FB}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{D0B1E280-BC14-7225-659A-AADB51DC3DA8}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{A962709D-1523-ECD3-DE5D-35514ADD30B0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{44F4FC4F-30C2-F055-1956-617C05C3CCBA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{3AB0B2BD-A61C-6EB8-6F10-0616DB3B9020}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{9749B955-8317-AD5B-6CAB-1D82581889C0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{06EE6C9E-F27C-F667-9B9B-0A638709070E}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{6D8A6859-5958-5C5F-42EC-CC852E5938C4}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{5CF7BA51-4886-441B-F1A4-5816DD1255C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{C4047277-B093-FB40-59B2-0F3C45200CE7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{96F2E780-8255-7725-2BDB-AFDB171D43A8}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{ADC1E880-9924-7825-42AA-B0DB2EEC43A8}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{9C9ED71A-8882-9870-F1E2-92C3DDE582F2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{B98C0F94-A586-38E6-8EF3-CEF67A8C9E52}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{A882657C-943D-5528-3DF5-CD72298F9FB8}</UniqueIdentifier>
+    </Filter>
     <Filter Include="common">
       <UniqueIdentifier>{AEFEE3F6-9AA0-0ECD-835B-22216F9C951D}</UniqueIdentifier>
     </Filter>
@@ -24,6 +114,312 @@
     </Filter>
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\common\BuildSettings.h">
       <Filter>common</Filter>
     </ClInclude>
Index: build/vs2017win10/libopenmpt-small.vcxproj
===================================================================
--- build/vs2017win10/libopenmpt-small.vcxproj	(revision 14628)
+++ build/vs2017win10/libopenmpt-small.vcxproj	(working copy)
@@ -533,7 +533,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -556,7 +556,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -579,7 +579,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -601,7 +601,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -623,7 +623,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -652,7 +652,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -680,7 +680,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -708,7 +708,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -736,7 +736,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -765,7 +765,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -793,7 +793,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -821,7 +821,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -849,7 +849,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -860,7 +860,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -876,7 +876,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -887,7 +887,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -903,7 +903,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -914,7 +914,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -930,7 +930,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -941,7 +941,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -957,7 +957,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -973,7 +973,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -991,7 +991,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1006,7 +1006,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1024,7 +1024,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1039,7 +1039,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1057,7 +1057,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1072,7 +1072,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1090,7 +1090,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1106,7 +1106,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1124,7 +1124,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1139,7 +1139,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1157,7 +1157,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1172,7 +1172,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1190,7 +1190,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1205,7 +1205,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1353,6 +1353,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2017win10/libopenmpt-small.vcxproj.filters
===================================================================
--- build/vs2017win10/libopenmpt-small.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/libopenmpt-small.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2017win10/libopenmpt.vcxproj
===================================================================
--- build/vs2017win10/libopenmpt.vcxproj	(revision 14628)
+++ build/vs2017win10/libopenmpt.vcxproj	(working copy)
@@ -533,7 +533,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -556,7 +556,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -579,7 +579,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -601,7 +601,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -623,7 +623,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -652,7 +652,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -680,7 +680,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -708,7 +708,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -736,7 +736,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -765,7 +765,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -793,7 +793,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -821,7 +821,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -849,7 +849,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -860,7 +860,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -876,7 +876,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -887,7 +887,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -903,7 +903,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -914,7 +914,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -930,7 +930,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -941,7 +941,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -957,7 +957,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -973,7 +973,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -991,7 +991,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1006,7 +1006,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1024,7 +1024,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1039,7 +1039,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1057,7 +1057,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1072,7 +1072,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1090,7 +1090,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1106,7 +1106,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1124,7 +1124,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1139,7 +1139,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1157,7 +1157,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1172,7 +1172,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1190,7 +1190,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1205,7 +1205,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1353,6 +1353,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2017win10/libopenmpt.vcxproj.filters
===================================================================
--- build/vs2017win10/libopenmpt.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/libopenmpt.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2017win10/libopenmpt_test.vcxproj
===================================================================
--- build/vs2017win10/libopenmpt_test.vcxproj	(revision 14628)
+++ build/vs2017win10/libopenmpt_test.vcxproj	(working copy)
@@ -283,7 +283,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -306,7 +306,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -329,7 +329,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -351,7 +351,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -373,7 +373,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -402,7 +402,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -430,7 +430,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -458,7 +458,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -486,7 +486,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -515,7 +515,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -543,7 +543,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -571,7 +571,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -729,6 +729,101 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -873,6 +968,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2017win10/libopenmpt_test.vcxproj.filters
===================================================================
--- build/vs2017win10/libopenmpt_test.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/libopenmpt_test.vcxproj.filters	(working copy)
@@ -22,6 +22,81 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -429,6 +504,291 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -857,6 +1217,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017win10/OpenMPT-ANSI.vcxproj
===================================================================
--- build/vs2017win10/OpenMPT-ANSI.vcxproj	(revision 14628)
+++ build/vs2017win10/OpenMPT-ANSI.vcxproj	(working copy)
@@ -570,7 +570,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -582,7 +582,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -605,7 +605,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -617,7 +617,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -640,7 +640,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -652,7 +652,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -674,7 +674,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -686,7 +686,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -708,7 +708,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -725,7 +725,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -749,7 +749,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -765,7 +765,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -789,7 +789,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -805,7 +805,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -829,7 +829,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -845,7 +845,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -869,7 +869,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -886,7 +886,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -910,7 +910,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -926,7 +926,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -950,7 +950,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -966,7 +966,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -990,7 +990,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1006,7 +1006,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1030,7 +1030,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1042,7 +1042,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1064,7 +1064,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1076,7 +1076,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1098,7 +1098,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1110,7 +1110,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1132,7 +1132,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1144,7 +1144,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1166,7 +1166,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1183,7 +1183,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1207,7 +1207,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1223,7 +1223,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1247,7 +1247,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1263,7 +1263,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1287,7 +1287,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1303,7 +1303,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1327,7 +1327,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1344,7 +1344,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1368,7 +1368,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1384,7 +1384,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1408,7 +1408,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1424,7 +1424,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1448,7 +1448,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1464,7 +1464,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1746,6 +1746,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1782,8 +1884,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -2021,6 +2121,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2017win10/OpenMPT-ANSI.vcxproj.filters
===================================================================
--- build/vs2017win10/OpenMPT-ANSI.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/OpenMPT-ANSI.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017win10/OpenMPT-NativeSupport.vcxproj
===================================================================
--- build/vs2017win10/OpenMPT-NativeSupport.vcxproj	(revision 14628)
+++ build/vs2017win10/OpenMPT-NativeSupport.vcxproj	(working copy)
@@ -545,7 +545,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -570,7 +570,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -595,7 +595,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -619,7 +619,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -643,7 +643,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -674,7 +674,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -704,7 +704,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -734,7 +734,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -764,7 +764,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -795,7 +795,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -825,7 +825,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -855,7 +855,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -885,7 +885,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -909,7 +909,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -933,7 +933,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -957,7 +957,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -981,7 +981,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1012,7 +1012,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1042,7 +1042,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1072,7 +1072,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1102,7 +1102,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1133,7 +1133,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1163,7 +1163,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1193,7 +1193,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1301,6 +1301,108 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceStub.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceUtilities.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -1324,8 +1426,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\wine\Native.cpp" />
     <ClCompile Include="..\..\mptrack\wine\NativeSoundDevice.cpp" />
Index: build/vs2017win10/OpenMPT-NativeSupport.vcxproj.filters
===================================================================
--- build/vs2017win10/OpenMPT-NativeSupport.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/OpenMPT-NativeSupport.vcxproj.filters	(working copy)
@@ -31,6 +31,96 @@
     <Filter Include="sounddev">
       <UniqueIdentifier>{8DE8B016-79B5-0B22-A2CE-F9C98EFA40B0}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -279,6 +369,312 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h">
       <Filter>sounddev</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -344,12 +740,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2017win10/OpenMPT-UTF8.vcxproj
===================================================================
--- build/vs2017win10/OpenMPT-UTF8.vcxproj	(revision 14628)
+++ build/vs2017win10/OpenMPT-UTF8.vcxproj	(working copy)
@@ -570,7 +570,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -582,7 +582,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -605,7 +605,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -617,7 +617,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -640,7 +640,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -652,7 +652,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -674,7 +674,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -686,7 +686,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -708,7 +708,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -725,7 +725,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -749,7 +749,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -765,7 +765,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -789,7 +789,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -805,7 +805,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -829,7 +829,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -845,7 +845,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -869,7 +869,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -886,7 +886,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -910,7 +910,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -926,7 +926,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -950,7 +950,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -966,7 +966,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -990,7 +990,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1006,7 +1006,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1030,7 +1030,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1042,7 +1042,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1064,7 +1064,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1076,7 +1076,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1098,7 +1098,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1110,7 +1110,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1132,7 +1132,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1144,7 +1144,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1166,7 +1166,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1183,7 +1183,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1207,7 +1207,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1223,7 +1223,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1247,7 +1247,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1263,7 +1263,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1287,7 +1287,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1303,7 +1303,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1327,7 +1327,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1344,7 +1344,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1368,7 +1368,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1384,7 +1384,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1408,7 +1408,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1424,7 +1424,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1448,7 +1448,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1464,7 +1464,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1746,6 +1746,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1782,8 +1884,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -2021,6 +2121,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2017win10/OpenMPT-UTF8.vcxproj.filters
===================================================================
--- build/vs2017win10/OpenMPT-UTF8.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/OpenMPT-UTF8.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017win10/OpenMPT-WineWrapper.vcxproj
===================================================================
--- build/vs2017win10/OpenMPT-WineWrapper.vcxproj	(revision 14628)
+++ build/vs2017win10/OpenMPT-WineWrapper.vcxproj	(working copy)
@@ -545,7 +545,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -569,7 +569,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -593,7 +593,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -616,7 +616,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -639,7 +639,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -669,7 +669,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -698,7 +698,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -727,7 +727,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -756,7 +756,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -786,7 +786,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -815,7 +815,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -844,7 +844,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -873,7 +873,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -896,7 +896,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -919,7 +919,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -942,7 +942,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -965,7 +965,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -995,7 +995,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1024,7 +1024,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1053,7 +1053,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1082,7 +1082,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1112,7 +1112,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1141,7 +1141,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1170,7 +1170,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
Index: build/vs2017win10/OpenMPT.vcxproj
===================================================================
--- build/vs2017win10/OpenMPT.vcxproj	(revision 14628)
+++ build/vs2017win10/OpenMPT.vcxproj	(working copy)
@@ -570,7 +570,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -582,7 +582,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -605,7 +605,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -617,7 +617,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -640,7 +640,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -652,7 +652,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -674,7 +674,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -686,7 +686,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -708,7 +708,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -725,7 +725,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -749,7 +749,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -765,7 +765,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -789,7 +789,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -805,7 +805,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -829,7 +829,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -845,7 +845,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -869,7 +869,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -886,7 +886,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -910,7 +910,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -926,7 +926,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -950,7 +950,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -966,7 +966,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -990,7 +990,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1006,7 +1006,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1030,7 +1030,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1042,7 +1042,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1064,7 +1064,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1076,7 +1076,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1098,7 +1098,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1110,7 +1110,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1132,7 +1132,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1144,7 +1144,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1166,7 +1166,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1183,7 +1183,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1207,7 +1207,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1223,7 +1223,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1247,7 +1247,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1263,7 +1263,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1287,7 +1287,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1303,7 +1303,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1327,7 +1327,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1344,7 +1344,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1368,7 +1368,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1384,7 +1384,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1408,7 +1408,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1424,7 +1424,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1448,7 +1448,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1464,7 +1464,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1746,6 +1746,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1782,8 +1884,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -2021,6 +2121,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2017win10/OpenMPT.vcxproj.filters
===================================================================
--- build/vs2017win10/OpenMPT.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/OpenMPT.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017win10/openmpt123.vcxproj
===================================================================
--- build/vs2017win10/openmpt123.vcxproj	(revision 14628)
+++ build/vs2017win10/openmpt123.vcxproj	(working copy)
@@ -545,7 +545,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -556,7 +556,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -574,7 +574,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -585,7 +585,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -603,7 +603,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -614,7 +614,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -631,7 +631,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -642,7 +642,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -659,7 +659,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -675,7 +675,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -694,7 +694,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -709,7 +709,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -728,7 +728,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -743,7 +743,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -762,7 +762,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -777,7 +777,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -796,7 +796,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -812,7 +812,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -831,7 +831,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -846,7 +846,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -865,7 +865,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -880,7 +880,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -899,7 +899,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -914,7 +914,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -933,7 +933,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -944,7 +944,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -961,7 +961,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -972,7 +972,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -989,7 +989,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1000,7 +1000,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1017,7 +1017,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1028,7 +1028,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1045,7 +1045,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1061,7 +1061,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1080,7 +1080,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1095,7 +1095,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1114,7 +1114,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1129,7 +1129,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1148,7 +1148,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1163,7 +1163,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1182,7 +1182,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1198,7 +1198,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1217,7 +1217,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1232,7 +1232,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1251,7 +1251,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1266,7 +1266,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1285,7 +1285,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1300,7 +1300,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1327,6 +1327,57 @@
     <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
Index: build/vs2017win10/openmpt123.vcxproj.filters
===================================================================
--- build/vs2017win10/openmpt123.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/openmpt123.vcxproj.filters	(working copy)
@@ -4,23 +4,220 @@
     <Filter Include="libopenmpt">
       <UniqueIdentifier>{FFE9848F-EBA1-C6DC-54A9-9F38408061CD}</UniqueIdentifier>
     </Filter>
+    <Filter Include="openmpt123">
+      <UniqueIdentifier>{BECCA03C-AA84-E289-138C-BBE5FF627D7A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="..\..\openmpt123\openmpt123.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\openmpt123\openmpt123.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
+    <ClCompile Include="..\..\openmpt123\openmpt123.cpp">
+      <Filter>openmpt123</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\libopenmpt\libopenmpt_version.rc">
Index: build/vs2017win10/PluginBridge.vcxproj
===================================================================
--- build/vs2017win10/PluginBridge.vcxproj	(revision 14628)
+++ build/vs2017win10/PluginBridge.vcxproj	(working copy)
@@ -545,7 +545,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -556,7 +556,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -577,7 +577,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -588,7 +588,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -609,7 +609,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -620,7 +620,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -640,7 +640,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -651,7 +651,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -671,7 +671,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -687,7 +687,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -709,7 +709,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -724,7 +724,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -746,7 +746,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -761,7 +761,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -783,7 +783,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -798,7 +798,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -820,7 +820,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -836,7 +836,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -858,7 +858,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -873,7 +873,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -895,7 +895,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -910,7 +910,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -932,7 +932,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -947,7 +947,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -969,7 +969,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -980,7 +980,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1000,7 +1000,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1011,7 +1011,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1031,7 +1031,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1042,7 +1042,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1062,7 +1062,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1073,7 +1073,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1093,7 +1093,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1109,7 +1109,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1131,7 +1131,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1146,7 +1146,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1168,7 +1168,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1183,7 +1183,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1205,7 +1205,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1220,7 +1220,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1242,7 +1242,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1258,7 +1258,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1280,7 +1280,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1295,7 +1295,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1317,7 +1317,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1332,7 +1332,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1354,7 +1354,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1369,7 +1369,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1393,6 +1393,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2017win10/PluginBridge.vcxproj.filters
===================================================================
--- build/vs2017win10/PluginBridge.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/PluginBridge.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2017win10/PluginBridgeLegacy.vcxproj
===================================================================
--- build/vs2017win10/PluginBridgeLegacy.vcxproj	(revision 14628)
+++ build/vs2017win10/PluginBridgeLegacy.vcxproj	(working copy)
@@ -545,7 +545,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -556,7 +556,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -577,7 +577,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -588,7 +588,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -610,7 +610,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -621,7 +621,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -640,7 +640,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -651,7 +651,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -671,7 +671,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -687,7 +687,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -709,7 +709,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -724,7 +724,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -747,7 +747,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -762,7 +762,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -783,7 +783,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -798,7 +798,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -820,7 +820,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -836,7 +836,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -858,7 +858,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -873,7 +873,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -896,7 +896,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -911,7 +911,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -932,7 +932,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -947,7 +947,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -969,7 +969,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -980,7 +980,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1000,7 +1000,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1011,7 +1011,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1032,7 +1032,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1043,7 +1043,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1062,7 +1062,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1073,7 +1073,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1093,7 +1093,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1109,7 +1109,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1131,7 +1131,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1146,7 +1146,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1169,7 +1169,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1184,7 +1184,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1205,7 +1205,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1220,7 +1220,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1242,7 +1242,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1258,7 +1258,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1280,7 +1280,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1295,7 +1295,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1318,7 +1318,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1333,7 +1333,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1354,7 +1354,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1369,7 +1369,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1393,6 +1393,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2017win10/PluginBridgeLegacy.vcxproj.filters
===================================================================
--- build/vs2017win10/PluginBridgeLegacy.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/PluginBridgeLegacy.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2017win10/signtool.vcxproj
===================================================================
--- build/vs2017win10/signtool.vcxproj	(revision 14628)
+++ build/vs2017win10/signtool.vcxproj	(working copy)
@@ -545,7 +545,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -569,7 +569,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -593,7 +593,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -616,7 +616,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -639,7 +639,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -669,7 +669,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -698,7 +698,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -727,7 +727,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -756,7 +756,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -786,7 +786,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -815,7 +815,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -844,7 +844,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -873,7 +873,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -896,7 +896,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -919,7 +919,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -942,7 +942,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -965,7 +965,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -995,7 +995,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1024,7 +1024,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1053,7 +1053,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1082,7 +1082,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1112,7 +1112,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1141,7 +1141,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1170,7 +1170,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1242,6 +1242,108 @@
     <ClInclude Include="..\..\misc\mptCrypto.h" />
     <ClInclude Include="..\..\misc\mptUUIDNamespace.h" />
     <ClInclude Include="..\..\misc\mptWine.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -1266,8 +1368,6 @@
     <ClCompile Include="..\..\installer\signtool\signtool.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2017win10/signtool.vcxproj.filters
===================================================================
--- build/vs2017win10/signtool.vcxproj.filters	(revision 14628)
+++ build/vs2017win10/signtool.vcxproj.filters	(working copy)
@@ -13,6 +13,96 @@
     <Filter Include="misc">
       <UniqueIdentifier>{B1A29A7C-9DD9-9B0D-46C6-811032DC170F}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -156,6 +246,312 @@
     <ClInclude Include="..\..\misc\mptWine.h">
       <Filter>misc</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -224,12 +620,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2017win7/libopenmpt-small.vcxproj
===================================================================
--- build/vs2017win7/libopenmpt-small.vcxproj	(revision 14628)
+++ build/vs2017win7/libopenmpt-small.vcxproj	(working copy)
@@ -270,7 +270,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -292,7 +292,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -314,7 +314,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -342,7 +342,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -369,7 +369,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -397,7 +397,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -424,7 +424,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -434,7 +434,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -450,7 +450,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -460,7 +460,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -476,7 +476,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -491,7 +491,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -509,7 +509,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -523,7 +523,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -541,7 +541,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -556,7 +556,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -574,7 +574,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -588,7 +588,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -736,6 +736,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2017win7/libopenmpt-small.vcxproj.filters
===================================================================
--- build/vs2017win7/libopenmpt-small.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/libopenmpt-small.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2017win7/libopenmpt.vcxproj
===================================================================
--- build/vs2017win7/libopenmpt.vcxproj	(revision 14628)
+++ build/vs2017win7/libopenmpt.vcxproj	(working copy)
@@ -270,7 +270,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -292,7 +292,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -314,7 +314,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -342,7 +342,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -369,7 +369,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -397,7 +397,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -424,7 +424,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -434,7 +434,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -450,7 +450,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -460,7 +460,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -476,7 +476,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -491,7 +491,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -509,7 +509,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -523,7 +523,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -541,7 +541,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -556,7 +556,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -574,7 +574,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -588,7 +588,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -736,6 +736,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2017win7/libopenmpt.vcxproj.filters
===================================================================
--- build/vs2017win7/libopenmpt.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/libopenmpt.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2017win7/libopenmpt_test.vcxproj
===================================================================
--- build/vs2017win7/libopenmpt_test.vcxproj	(revision 14628)
+++ build/vs2017win7/libopenmpt_test.vcxproj	(working copy)
@@ -148,7 +148,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -170,7 +170,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -192,7 +192,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -220,7 +220,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -247,7 +247,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -432,6 +432,101 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -576,6 +671,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2017win7/libopenmpt_test.vcxproj.filters
===================================================================
--- build/vs2017win7/libopenmpt_test.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/libopenmpt_test.vcxproj.filters	(working copy)
@@ -22,6 +22,81 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -429,6 +504,291 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -857,6 +1217,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017win7/OpenMPT-ANSI.vcxproj
===================================================================
--- build/vs2017win7/OpenMPT-ANSI.vcxproj	(revision 14628)
+++ build/vs2017win7/OpenMPT-ANSI.vcxproj	(working copy)
@@ -289,7 +289,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -300,7 +300,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -323,7 +323,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -334,7 +334,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -357,7 +357,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -373,7 +373,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -397,7 +397,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -412,7 +412,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -436,7 +436,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -452,7 +452,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -476,7 +476,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -491,7 +491,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -515,7 +515,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -526,7 +526,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -548,7 +548,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -559,7 +559,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -581,7 +581,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -597,7 +597,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -621,7 +621,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -636,7 +636,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -660,7 +660,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -676,7 +676,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -700,7 +700,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -715,7 +715,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -997,6 +997,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1033,8 +1135,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1272,6 +1372,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2017win7/OpenMPT-ANSI.vcxproj.filters
===================================================================
--- build/vs2017win7/OpenMPT-ANSI.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/OpenMPT-ANSI.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017win7/OpenMPT-NativeSupport.vcxproj
===================================================================
--- build/vs2017win7/OpenMPT-NativeSupport.vcxproj	(revision 14628)
+++ build/vs2017win7/OpenMPT-NativeSupport.vcxproj	(working copy)
@@ -276,7 +276,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -300,7 +300,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -324,7 +324,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -354,7 +354,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -383,7 +383,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -413,7 +413,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -442,7 +442,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -465,7 +465,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -488,7 +488,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -518,7 +518,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -547,7 +547,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -577,7 +577,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -684,6 +684,108 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceStub.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceUtilities.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -707,8 +809,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\wine\Native.cpp" />
     <ClCompile Include="..\..\mptrack\wine\NativeSoundDevice.cpp" />
Index: build/vs2017win7/OpenMPT-NativeSupport.vcxproj.filters
===================================================================
--- build/vs2017win7/OpenMPT-NativeSupport.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/OpenMPT-NativeSupport.vcxproj.filters	(working copy)
@@ -31,6 +31,96 @@
     <Filter Include="sounddev">
       <UniqueIdentifier>{8DE8B016-79B5-0B22-A2CE-F9C98EFA40B0}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -279,6 +369,312 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h">
       <Filter>sounddev</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -344,12 +740,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2017win7/OpenMPT-UTF8.vcxproj
===================================================================
--- build/vs2017win7/OpenMPT-UTF8.vcxproj	(revision 14628)
+++ build/vs2017win7/OpenMPT-UTF8.vcxproj	(working copy)
@@ -289,7 +289,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -300,7 +300,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -323,7 +323,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -334,7 +334,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -357,7 +357,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -373,7 +373,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -397,7 +397,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -412,7 +412,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -436,7 +436,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -452,7 +452,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -476,7 +476,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -491,7 +491,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -515,7 +515,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -526,7 +526,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -548,7 +548,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -559,7 +559,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -581,7 +581,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -597,7 +597,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -621,7 +621,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -636,7 +636,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -660,7 +660,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -676,7 +676,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -700,7 +700,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -715,7 +715,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -997,6 +997,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1033,8 +1135,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1272,6 +1372,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2017win7/OpenMPT-UTF8.vcxproj.filters
===================================================================
--- build/vs2017win7/OpenMPT-UTF8.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/OpenMPT-UTF8.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017win7/OpenMPT-WineWrapper.vcxproj
===================================================================
--- build/vs2017win7/OpenMPT-WineWrapper.vcxproj	(revision 14628)
+++ build/vs2017win7/OpenMPT-WineWrapper.vcxproj	(working copy)
@@ -276,7 +276,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -299,7 +299,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -322,7 +322,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -351,7 +351,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -379,7 +379,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -408,7 +408,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -436,7 +436,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -458,7 +458,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -480,7 +480,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -509,7 +509,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -537,7 +537,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -566,7 +566,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
Index: build/vs2017win7/OpenMPT.vcxproj
===================================================================
--- build/vs2017win7/OpenMPT.vcxproj	(revision 14628)
+++ build/vs2017win7/OpenMPT.vcxproj	(working copy)
@@ -289,7 +289,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -300,7 +300,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -323,7 +323,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -334,7 +334,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -357,7 +357,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -373,7 +373,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -397,7 +397,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -412,7 +412,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -436,7 +436,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -452,7 +452,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -476,7 +476,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -491,7 +491,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -515,7 +515,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -526,7 +526,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -548,7 +548,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -559,7 +559,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -581,7 +581,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -597,7 +597,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -621,7 +621,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -636,7 +636,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -660,7 +660,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -676,7 +676,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -700,7 +700,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -715,7 +715,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -997,6 +997,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1033,8 +1135,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1272,6 +1372,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2017win7/OpenMPT.vcxproj.filters
===================================================================
--- build/vs2017win7/OpenMPT.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/OpenMPT.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017win7/openmpt123.vcxproj
===================================================================
--- build/vs2017win7/openmpt123.vcxproj	(revision 14628)
+++ build/vs2017win7/openmpt123.vcxproj	(working copy)
@@ -276,7 +276,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -286,7 +286,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -304,7 +304,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -314,7 +314,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -332,7 +332,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -347,7 +347,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -366,7 +366,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -380,7 +380,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -399,7 +399,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -414,7 +414,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -433,7 +433,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -447,7 +447,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -466,7 +466,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -476,7 +476,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -493,7 +493,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -503,7 +503,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -520,7 +520,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -535,7 +535,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -554,7 +554,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -568,7 +568,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -587,7 +587,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -602,7 +602,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -621,7 +621,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -635,7 +635,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -662,6 +662,57 @@
     <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
Index: build/vs2017win7/openmpt123.vcxproj.filters
===================================================================
--- build/vs2017win7/openmpt123.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/openmpt123.vcxproj.filters	(working copy)
@@ -4,23 +4,220 @@
     <Filter Include="libopenmpt">
       <UniqueIdentifier>{FFE9848F-EBA1-C6DC-54A9-9F38408061CD}</UniqueIdentifier>
     </Filter>
+    <Filter Include="openmpt123">
+      <UniqueIdentifier>{BECCA03C-AA84-E289-138C-BBE5FF627D7A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="..\..\openmpt123\openmpt123.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\openmpt123\openmpt123.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
+    <ClCompile Include="..\..\openmpt123\openmpt123.cpp">
+      <Filter>openmpt123</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\libopenmpt\libopenmpt_version.rc">
Index: build/vs2017win7/PluginBridge.vcxproj
===================================================================
--- build/vs2017win7/PluginBridge.vcxproj	(revision 14628)
+++ build/vs2017win7/PluginBridge.vcxproj	(working copy)
@@ -276,7 +276,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -286,7 +286,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -307,7 +307,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -317,7 +317,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -338,7 +338,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -353,7 +353,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -375,7 +375,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -389,7 +389,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -411,7 +411,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -426,7 +426,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -448,7 +448,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -462,7 +462,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -484,7 +484,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -494,7 +494,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -514,7 +514,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -524,7 +524,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -544,7 +544,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -559,7 +559,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -581,7 +581,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -595,7 +595,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -617,7 +617,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -632,7 +632,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -654,7 +654,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -668,7 +668,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -692,6 +692,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2017win7/PluginBridge.vcxproj.filters
===================================================================
--- build/vs2017win7/PluginBridge.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/PluginBridge.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2017win7/PluginBridgeLegacy.vcxproj
===================================================================
--- build/vs2017win7/PluginBridgeLegacy.vcxproj	(revision 14628)
+++ build/vs2017win7/PluginBridgeLegacy.vcxproj	(working copy)
@@ -276,7 +276,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -286,7 +286,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -307,7 +307,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -317,7 +317,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -339,7 +339,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -354,7 +354,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -376,7 +376,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -390,7 +390,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -413,7 +413,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -428,7 +428,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -450,7 +450,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -464,7 +464,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -487,7 +487,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -497,7 +497,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -517,7 +517,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -527,7 +527,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -548,7 +548,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -563,7 +563,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -585,7 +585,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -599,7 +599,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -622,7 +622,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -637,7 +637,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -659,7 +659,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -673,7 +673,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -698,6 +698,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2017win7/PluginBridgeLegacy.vcxproj.filters
===================================================================
--- build/vs2017win7/PluginBridgeLegacy.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/PluginBridgeLegacy.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2017win7/signtool.vcxproj
===================================================================
--- build/vs2017win7/signtool.vcxproj	(revision 14628)
+++ build/vs2017win7/signtool.vcxproj	(working copy)
@@ -276,7 +276,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -299,7 +299,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -322,7 +322,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -351,7 +351,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -379,7 +379,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -408,7 +408,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -436,7 +436,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -458,7 +458,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -480,7 +480,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -509,7 +509,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -537,7 +537,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -566,7 +566,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -637,6 +637,108 @@
     <ClInclude Include="..\..\misc\mptCrypto.h" />
     <ClInclude Include="..\..\misc\mptUUIDNamespace.h" />
     <ClInclude Include="..\..\misc\mptWine.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -661,8 +763,6 @@
     <ClCompile Include="..\..\installer\signtool\signtool.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2017win7/signtool.vcxproj.filters
===================================================================
--- build/vs2017win7/signtool.vcxproj.filters	(revision 14628)
+++ build/vs2017win7/signtool.vcxproj.filters	(working copy)
@@ -13,6 +13,96 @@
     <Filter Include="misc">
       <UniqueIdentifier>{B1A29A7C-9DD9-9B0D-46C6-811032DC170F}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -156,6 +246,312 @@
     <ClInclude Include="..\..\misc\mptWine.h">
       <Filter>misc</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -224,12 +620,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2017winxp/libopenmpt-small.vcxproj
===================================================================
--- build/vs2017winxp/libopenmpt-small.vcxproj	(revision 14628)
+++ build/vs2017winxp/libopenmpt-small.vcxproj	(working copy)
@@ -258,7 +258,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -282,7 +282,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -305,7 +305,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -334,7 +334,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -362,7 +362,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -391,7 +391,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -419,7 +419,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -431,7 +431,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -447,7 +447,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -458,7 +458,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -474,7 +474,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -490,7 +490,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -508,7 +508,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -523,7 +523,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -541,7 +541,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -557,7 +557,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -575,7 +575,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -590,7 +590,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -738,6 +738,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2017winxp/libopenmpt-small.vcxproj.filters
===================================================================
--- build/vs2017winxp/libopenmpt-small.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/libopenmpt-small.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2017winxp/libopenmpt.vcxproj
===================================================================
--- build/vs2017winxp/libopenmpt.vcxproj	(revision 14628)
+++ build/vs2017winxp/libopenmpt.vcxproj	(working copy)
@@ -258,7 +258,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -282,7 +282,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -305,7 +305,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -334,7 +334,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -362,7 +362,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -391,7 +391,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -419,7 +419,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -431,7 +431,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -447,7 +447,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -458,7 +458,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -474,7 +474,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -490,7 +490,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -508,7 +508,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -523,7 +523,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -541,7 +541,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -557,7 +557,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -575,7 +575,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -590,7 +590,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -738,6 +738,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2017winxp/libopenmpt.vcxproj.filters
===================================================================
--- build/vs2017winxp/libopenmpt.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/libopenmpt.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2017winxp/libopenmpt_test.vcxproj
===================================================================
--- build/vs2017winxp/libopenmpt_test.vcxproj	(revision 14628)
+++ build/vs2017winxp/libopenmpt_test.vcxproj	(working copy)
@@ -142,7 +142,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -166,7 +166,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -189,7 +189,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -218,7 +218,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -246,7 +246,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -433,6 +433,101 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -577,6 +672,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2017winxp/libopenmpt_test.vcxproj.filters
===================================================================
--- build/vs2017winxp/libopenmpt_test.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/libopenmpt_test.vcxproj.filters	(working copy)
@@ -22,6 +22,81 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -429,6 +504,291 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -857,6 +1217,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017winxp/OpenMPT-ANSI.vcxproj
===================================================================
--- build/vs2017winxp/OpenMPT-ANSI.vcxproj	(revision 14628)
+++ build/vs2017winxp/OpenMPT-ANSI.vcxproj	(working copy)
@@ -277,7 +277,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -290,7 +290,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -312,7 +312,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -324,7 +324,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -346,7 +346,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -363,7 +363,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -386,7 +386,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -402,7 +402,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -425,7 +425,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -442,7 +442,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -465,7 +465,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -481,7 +481,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -504,7 +504,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -517,7 +517,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -538,7 +538,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -550,7 +550,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -571,7 +571,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -588,7 +588,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -611,7 +611,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -627,7 +627,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -650,7 +650,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -667,7 +667,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -690,7 +690,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -706,7 +706,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -978,6 +978,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1014,8 +1116,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1253,6 +1353,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2017winxp/OpenMPT-ANSI.vcxproj.filters
===================================================================
--- build/vs2017winxp/OpenMPT-ANSI.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/OpenMPT-ANSI.vcxproj.filters	(working copy)
@@ -49,6 +49,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -822,6 +912,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -926,12 +1322,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1643,6 +2033,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017winxp/OpenMPT-NativeSupport.vcxproj
===================================================================
--- build/vs2017winxp/OpenMPT-NativeSupport.vcxproj	(revision 14628)
+++ build/vs2017winxp/OpenMPT-NativeSupport.vcxproj	(working copy)
@@ -264,7 +264,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -290,7 +290,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -315,7 +315,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -346,7 +346,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -376,7 +376,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -407,7 +407,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -437,7 +437,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -462,7 +462,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -486,7 +486,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -517,7 +517,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -547,7 +547,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -578,7 +578,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -686,6 +686,108 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceStub.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceUtilities.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -709,8 +811,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\wine\Native.cpp" />
     <ClCompile Include="..\..\mptrack\wine\NativeSoundDevice.cpp" />
Index: build/vs2017winxp/OpenMPT-NativeSupport.vcxproj.filters
===================================================================
--- build/vs2017winxp/OpenMPT-NativeSupport.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/OpenMPT-NativeSupport.vcxproj.filters	(working copy)
@@ -31,6 +31,96 @@
     <Filter Include="sounddev">
       <UniqueIdentifier>{8DE8B016-79B5-0B22-A2CE-F9C98EFA40B0}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -279,6 +369,312 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h">
       <Filter>sounddev</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -344,12 +740,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2017winxp/OpenMPT-UTF8.vcxproj
===================================================================
--- build/vs2017winxp/OpenMPT-UTF8.vcxproj	(revision 14628)
+++ build/vs2017winxp/OpenMPT-UTF8.vcxproj	(working copy)
@@ -277,7 +277,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -290,7 +290,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -312,7 +312,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -324,7 +324,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -346,7 +346,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -363,7 +363,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -386,7 +386,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -402,7 +402,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -425,7 +425,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -442,7 +442,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -465,7 +465,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -481,7 +481,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -504,7 +504,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -517,7 +517,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -538,7 +538,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -550,7 +550,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -571,7 +571,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -588,7 +588,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -611,7 +611,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -627,7 +627,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -650,7 +650,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -667,7 +667,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -690,7 +690,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -706,7 +706,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -978,6 +978,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1014,8 +1116,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1253,6 +1353,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2017winxp/OpenMPT-UTF8.vcxproj.filters
===================================================================
--- build/vs2017winxp/OpenMPT-UTF8.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/OpenMPT-UTF8.vcxproj.filters	(working copy)
@@ -49,6 +49,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -822,6 +912,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -926,12 +1322,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1643,6 +2033,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017winxp/OpenMPT-WineWrapper.vcxproj
===================================================================
--- build/vs2017winxp/OpenMPT-WineWrapper.vcxproj	(revision 14628)
+++ build/vs2017winxp/OpenMPT-WineWrapper.vcxproj	(working copy)
@@ -264,7 +264,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -289,7 +289,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -313,7 +313,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -343,7 +343,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -372,7 +372,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -402,7 +402,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -431,7 +431,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -455,7 +455,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -478,7 +478,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -508,7 +508,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -537,7 +537,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -567,7 +567,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
Index: build/vs2017winxp/OpenMPT.vcxproj
===================================================================
--- build/vs2017winxp/OpenMPT.vcxproj	(revision 14628)
+++ build/vs2017winxp/OpenMPT.vcxproj	(working copy)
@@ -277,7 +277,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -290,7 +290,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -312,7 +312,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -324,7 +324,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -346,7 +346,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -363,7 +363,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -386,7 +386,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -402,7 +402,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -425,7 +425,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -442,7 +442,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -465,7 +465,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -481,7 +481,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -504,7 +504,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -517,7 +517,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -538,7 +538,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -550,7 +550,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -571,7 +571,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -588,7 +588,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -611,7 +611,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -627,7 +627,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -650,7 +650,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -667,7 +667,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -690,7 +690,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -706,7 +706,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -978,6 +978,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1014,8 +1116,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1253,6 +1353,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2017winxp/OpenMPT.vcxproj.filters
===================================================================
--- build/vs2017winxp/OpenMPT.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/OpenMPT.vcxproj.filters	(working copy)
@@ -49,6 +49,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -822,6 +912,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -926,12 +1322,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1643,6 +2033,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2017winxp/openmpt123.vcxproj
===================================================================
--- build/vs2017winxp/openmpt123.vcxproj	(revision 14628)
+++ build/vs2017winxp/openmpt123.vcxproj	(working copy)
@@ -264,7 +264,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -276,7 +276,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -294,7 +294,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -305,7 +305,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -323,7 +323,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -339,7 +339,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -358,7 +358,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -373,7 +373,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -392,7 +392,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -408,7 +408,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -427,7 +427,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -442,7 +442,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -461,7 +461,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -473,7 +473,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -490,7 +490,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -501,7 +501,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -518,7 +518,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -534,7 +534,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -553,7 +553,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -568,7 +568,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -587,7 +587,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -603,7 +603,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -622,7 +622,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -637,7 +637,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -664,6 +664,57 @@
     <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
Index: build/vs2017winxp/openmpt123.vcxproj.filters
===================================================================
--- build/vs2017winxp/openmpt123.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/openmpt123.vcxproj.filters	(working copy)
@@ -4,23 +4,220 @@
     <Filter Include="libopenmpt">
       <UniqueIdentifier>{FFE9848F-EBA1-C6DC-54A9-9F38408061CD}</UniqueIdentifier>
     </Filter>
+    <Filter Include="openmpt123">
+      <UniqueIdentifier>{BECCA03C-AA84-E289-138C-BBE5FF627D7A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="..\..\openmpt123\openmpt123.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\openmpt123\openmpt123.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
+    <ClCompile Include="..\..\openmpt123\openmpt123.cpp">
+      <Filter>openmpt123</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\libopenmpt\libopenmpt_version.rc">
Index: build/vs2017winxp/PluginBridge.vcxproj
===================================================================
--- build/vs2017winxp/PluginBridge.vcxproj	(revision 14628)
+++ build/vs2017winxp/PluginBridge.vcxproj	(working copy)
@@ -264,7 +264,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -276,7 +276,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -296,7 +296,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -307,7 +307,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -327,7 +327,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -343,7 +343,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -364,7 +364,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -379,7 +379,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -400,7 +400,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -416,7 +416,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -437,7 +437,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -452,7 +452,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -473,7 +473,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -485,7 +485,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -504,7 +504,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -515,7 +515,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -534,7 +534,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -550,7 +550,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -571,7 +571,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -586,7 +586,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -607,7 +607,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -623,7 +623,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -644,7 +644,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -659,7 +659,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -682,6 +682,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2017winxp/PluginBridge.vcxproj.filters
===================================================================
--- build/vs2017winxp/PluginBridge.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/PluginBridge.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2017winxp/PluginBridgeLegacy.vcxproj
===================================================================
--- build/vs2017winxp/PluginBridgeLegacy.vcxproj	(revision 14628)
+++ build/vs2017winxp/PluginBridgeLegacy.vcxproj	(working copy)
@@ -264,7 +264,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -276,7 +276,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -297,7 +297,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -308,7 +308,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -330,7 +330,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -346,7 +346,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -368,7 +368,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -383,7 +383,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -406,7 +406,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -422,7 +422,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -444,7 +444,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -459,7 +459,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -482,7 +482,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -494,7 +494,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -514,7 +514,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -525,7 +525,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -546,7 +546,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -562,7 +562,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -584,7 +584,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -599,7 +599,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -622,7 +622,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -638,7 +638,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -660,7 +660,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -675,7 +675,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -700,6 +700,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2017winxp/PluginBridgeLegacy.vcxproj.filters
===================================================================
--- build/vs2017winxp/PluginBridgeLegacy.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/PluginBridgeLegacy.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2017winxp/signtool.vcxproj
===================================================================
--- build/vs2017winxp/signtool.vcxproj	(revision 14628)
+++ build/vs2017winxp/signtool.vcxproj	(working copy)
@@ -264,7 +264,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -289,7 +289,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -313,7 +313,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -343,7 +343,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -372,7 +372,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -402,7 +402,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -431,7 +431,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -455,7 +455,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -478,7 +478,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -508,7 +508,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -537,7 +537,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0501;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -567,7 +567,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>MPT_BUILD_RETRO;DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0502;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -639,6 +639,108 @@
     <ClInclude Include="..\..\misc\mptCrypto.h" />
     <ClInclude Include="..\..\misc\mptUUIDNamespace.h" />
     <ClInclude Include="..\..\misc\mptWine.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -663,8 +765,6 @@
     <ClCompile Include="..\..\installer\signtool\signtool.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2017winxp/signtool.vcxproj.filters
===================================================================
--- build/vs2017winxp/signtool.vcxproj.filters	(revision 14628)
+++ build/vs2017winxp/signtool.vcxproj.filters	(working copy)
@@ -13,6 +13,96 @@
     <Filter Include="misc">
       <UniqueIdentifier>{B1A29A7C-9DD9-9B0D-46C6-811032DC170F}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -156,6 +246,312 @@
     <ClInclude Include="..\..\misc\mptWine.h">
       <Filter>misc</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -224,12 +620,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2019uwp/libopenmpt.vcxproj
===================================================================
--- build/vs2019uwp/libopenmpt.vcxproj	(revision 14628)
+++ build/vs2019uwp/libopenmpt.vcxproj	(working copy)
@@ -390,7 +390,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -406,7 +406,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -425,7 +425,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -441,7 +441,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -460,7 +460,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -476,7 +476,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -494,7 +494,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -510,7 +510,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -528,7 +528,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -545,7 +545,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -566,7 +566,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -583,7 +583,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -604,7 +604,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -621,7 +621,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -641,7 +641,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -658,7 +658,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
   <Lib>
     <OutputFile>$(OutDir)libopenmpt.lib</OutputFile>
@@ -678,7 +678,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -694,7 +694,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -713,7 +713,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -729,7 +729,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -748,7 +748,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -764,7 +764,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -782,7 +782,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -798,7 +798,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -816,7 +816,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -833,7 +833,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -854,7 +854,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -871,7 +871,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -892,7 +892,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -909,7 +909,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -929,7 +929,7 @@
     <ClCompile>
       <AdditionalOptions>  %(AdditionalOptions)</AdditionalOptions>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>false</MinimalRebuild>
       <StringPooling>true</StringPooling>
@@ -946,7 +946,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD_DLL;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -963,6 +963,126 @@
     </PreBuildEvent>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <ExcludedFromBuild>true</ExcludedFromBuild>
+    </ClInclude>
     <ClInclude Include="..\..\common\BuildSettings.h" />
     <ClInclude Include="..\..\common\CompilerDetect.h" />
     <ClInclude Include="..\..\common\ComponentManager.h" />
Index: build/vs2019uwp/libopenmpt.vcxproj.filters
===================================================================
--- build/vs2019uwp/libopenmpt.vcxproj.filters	(revision 14628)
+++ build/vs2019uwp/libopenmpt.vcxproj.filters	(working copy)
@@ -1,6 +1,96 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="16.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{1ACB48A9-86AA-C744-8FC2-521BFB202EA6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{B102DE80-9D65-6D25-46EB-A5DB322D39A8}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{A092E23B-8C76-A391-F5D6-9DE4E1D98D13}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{3B77F730-2745-EB36-10D9-5B5DFC45C79B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{AAC627BD-9655-B186-3F74-C5812BE2C12C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{940CB49C-00CD-2FD3-C907-7950358774AF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{2EEFC068-9AA4-395E-2399-33358F4D3062}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{DD28764B-493F-74E1-92B6-FF02FE0B4569}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{97C4F533-8392-E939-6C26-5A605893C59E}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{06A9D974-F237-633E-9B56-773987C473E4}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{CFBF5C35-BB8D-503B-A421-C161908E2CA0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{A50F4C38-91DD-3F3E-7A71-B06466DE1BA3}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{94862B67-8015-B530-2934-C92B15A2C5D6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{4BCBC71D-B72C-A52B-409A-EBDDACFADBEA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{C9C6093D-B5C0-328F-9E2D-C99F8AC698FB}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{D0B1E280-BC14-7225-659A-AADB51DC3DA8}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{A962709D-1523-ECD3-DE5D-35514ADD30B0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{44F4FC4F-30C2-F055-1956-617C05C3CCBA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{3AB0B2BD-A61C-6EB8-6F10-0616DB3B9020}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{9749B955-8317-AD5B-6CAB-1D82581889C0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{06EE6C9E-F27C-F667-9B9B-0A638709070E}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{6D8A6859-5958-5C5F-42EC-CC852E5938C4}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{5CF7BA51-4886-441B-F1A4-5816DD1255C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{C4047277-B093-FB40-59B2-0F3C45200CE7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{96F2E780-8255-7725-2BDB-AFDB171D43A8}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{ADC1E880-9924-7825-42AA-B0DB2EEC43A8}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{9C9ED71A-8882-9870-F1E2-92C3DDE582F2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{B98C0F94-A586-38E6-8EF3-CEF67A8C9E52}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{A882657C-943D-5528-3DF5-CD72298F9FB8}</UniqueIdentifier>
+    </Filter>
     <Filter Include="common">
       <UniqueIdentifier>{AEFEE3F6-9AA0-0ECD-835B-22216F9C951D}</UniqueIdentifier>
     </Filter>
@@ -24,6 +114,312 @@
     </Filter>
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\common\BuildSettings.h">
       <Filter>common</Filter>
     </ClInclude>
Index: build/vs2019win10/libopenmpt-small.vcxproj
===================================================================
--- build/vs2019win10/libopenmpt-small.vcxproj	(revision 14628)
+++ build/vs2019win10/libopenmpt-small.vcxproj	(working copy)
@@ -531,7 +531,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -554,7 +554,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -577,7 +577,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -599,7 +599,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -621,7 +621,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -650,7 +650,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -678,7 +678,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -706,7 +706,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -734,7 +734,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -763,7 +763,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -791,7 +791,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -819,7 +819,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -847,7 +847,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -858,7 +858,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -874,7 +874,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -885,7 +885,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -901,7 +901,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -912,7 +912,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -928,7 +928,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -939,7 +939,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -955,7 +955,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -971,7 +971,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -989,7 +989,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1004,7 +1004,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1022,7 +1022,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1037,7 +1037,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1055,7 +1055,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1070,7 +1070,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1088,7 +1088,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1104,7 +1104,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1122,7 +1122,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1137,7 +1137,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1155,7 +1155,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1170,7 +1170,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1188,7 +1188,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1203,7 +1203,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1351,6 +1351,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2019win10/libopenmpt-small.vcxproj.filters
===================================================================
--- build/vs2019win10/libopenmpt-small.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/libopenmpt-small.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2019win10/libopenmpt.vcxproj
===================================================================
--- build/vs2019win10/libopenmpt.vcxproj	(revision 14628)
+++ build/vs2019win10/libopenmpt.vcxproj	(working copy)
@@ -531,7 +531,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -554,7 +554,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -577,7 +577,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -599,7 +599,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -621,7 +621,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -650,7 +650,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -678,7 +678,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -706,7 +706,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -734,7 +734,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -763,7 +763,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -791,7 +791,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -819,7 +819,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -847,7 +847,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -858,7 +858,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -874,7 +874,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -885,7 +885,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -901,7 +901,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -912,7 +912,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -928,7 +928,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -939,7 +939,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -955,7 +955,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -971,7 +971,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -989,7 +989,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1004,7 +1004,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1022,7 +1022,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1037,7 +1037,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1055,7 +1055,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1070,7 +1070,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1088,7 +1088,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1104,7 +1104,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1122,7 +1122,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1137,7 +1137,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1155,7 +1155,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1170,7 +1170,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1188,7 +1188,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1203,7 +1203,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1351,6 +1351,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2019win10/libopenmpt.vcxproj.filters
===================================================================
--- build/vs2019win10/libopenmpt.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/libopenmpt.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2019win10/libopenmpt_test.vcxproj
===================================================================
--- build/vs2019win10/libopenmpt_test.vcxproj	(revision 14628)
+++ build/vs2019win10/libopenmpt_test.vcxproj	(working copy)
@@ -281,7 +281,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -304,7 +304,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -327,7 +327,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -349,7 +349,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -371,7 +371,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -400,7 +400,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -428,7 +428,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -456,7 +456,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -484,7 +484,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -513,7 +513,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -541,7 +541,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -569,7 +569,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -727,6 +727,101 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -871,6 +966,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2019win10/libopenmpt_test.vcxproj.filters
===================================================================
--- build/vs2019win10/libopenmpt_test.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/libopenmpt_test.vcxproj.filters	(working copy)
@@ -22,6 +22,81 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -429,6 +504,291 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -857,6 +1217,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win10/OpenMPT-ANSI.vcxproj
===================================================================
--- build/vs2019win10/OpenMPT-ANSI.vcxproj	(revision 14628)
+++ build/vs2019win10/OpenMPT-ANSI.vcxproj	(working copy)
@@ -568,7 +568,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -580,7 +580,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -603,7 +603,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -615,7 +615,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -638,7 +638,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -650,7 +650,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -672,7 +672,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -684,7 +684,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -706,7 +706,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -723,7 +723,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -747,7 +747,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -763,7 +763,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -787,7 +787,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -803,7 +803,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -827,7 +827,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -843,7 +843,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -867,7 +867,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -884,7 +884,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -908,7 +908,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -924,7 +924,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -948,7 +948,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -964,7 +964,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -988,7 +988,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1004,7 +1004,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1028,7 +1028,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1040,7 +1040,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1062,7 +1062,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1074,7 +1074,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1096,7 +1096,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1108,7 +1108,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1130,7 +1130,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1142,7 +1142,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1164,7 +1164,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1181,7 +1181,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1205,7 +1205,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1221,7 +1221,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1245,7 +1245,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1261,7 +1261,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1285,7 +1285,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1301,7 +1301,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1325,7 +1325,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1342,7 +1342,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1366,7 +1366,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1382,7 +1382,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1406,7 +1406,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1422,7 +1422,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1446,7 +1446,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1462,7 +1462,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1744,6 +1744,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1780,8 +1882,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -2019,6 +2119,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win10/OpenMPT-ANSI.vcxproj.filters
===================================================================
--- build/vs2019win10/OpenMPT-ANSI.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/OpenMPT-ANSI.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win10/OpenMPT-NativeSupport.vcxproj
===================================================================
--- build/vs2019win10/OpenMPT-NativeSupport.vcxproj	(revision 14628)
+++ build/vs2019win10/OpenMPT-NativeSupport.vcxproj	(working copy)
@@ -543,7 +543,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -568,7 +568,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -593,7 +593,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -617,7 +617,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -641,7 +641,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -672,7 +672,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -702,7 +702,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -732,7 +732,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -762,7 +762,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -793,7 +793,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -823,7 +823,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -853,7 +853,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -883,7 +883,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -907,7 +907,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -931,7 +931,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -955,7 +955,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -979,7 +979,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1010,7 +1010,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1040,7 +1040,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1070,7 +1070,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1100,7 +1100,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1131,7 +1131,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1161,7 +1161,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1191,7 +1191,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1299,6 +1299,108 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceStub.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceUtilities.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -1322,8 +1424,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\wine\Native.cpp" />
     <ClCompile Include="..\..\mptrack\wine\NativeSoundDevice.cpp" />
Index: build/vs2019win10/OpenMPT-NativeSupport.vcxproj.filters
===================================================================
--- build/vs2019win10/OpenMPT-NativeSupport.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/OpenMPT-NativeSupport.vcxproj.filters	(working copy)
@@ -31,6 +31,96 @@
     <Filter Include="sounddev">
       <UniqueIdentifier>{8DE8B016-79B5-0B22-A2CE-F9C98EFA40B0}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -279,6 +369,312 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h">
       <Filter>sounddev</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -344,12 +740,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2019win10/OpenMPT-UTF8.vcxproj
===================================================================
--- build/vs2019win10/OpenMPT-UTF8.vcxproj	(revision 14628)
+++ build/vs2019win10/OpenMPT-UTF8.vcxproj	(working copy)
@@ -568,7 +568,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -580,7 +580,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -603,7 +603,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -615,7 +615,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -638,7 +638,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -650,7 +650,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -672,7 +672,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -684,7 +684,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -706,7 +706,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -723,7 +723,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -747,7 +747,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -763,7 +763,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -787,7 +787,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -803,7 +803,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -827,7 +827,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -843,7 +843,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -867,7 +867,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -884,7 +884,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -908,7 +908,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -924,7 +924,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -948,7 +948,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -964,7 +964,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -988,7 +988,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1004,7 +1004,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1028,7 +1028,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1040,7 +1040,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1062,7 +1062,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1074,7 +1074,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1096,7 +1096,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1108,7 +1108,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1130,7 +1130,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1142,7 +1142,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1164,7 +1164,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1181,7 +1181,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1205,7 +1205,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1221,7 +1221,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1245,7 +1245,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1261,7 +1261,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1285,7 +1285,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1301,7 +1301,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1325,7 +1325,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1342,7 +1342,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1366,7 +1366,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1382,7 +1382,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1406,7 +1406,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1422,7 +1422,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1446,7 +1446,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1462,7 +1462,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1744,6 +1744,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1780,8 +1882,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -2019,6 +2119,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win10/OpenMPT-UTF8.vcxproj.filters
===================================================================
--- build/vs2019win10/OpenMPT-UTF8.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/OpenMPT-UTF8.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win10/OpenMPT-WineWrapper.vcxproj
===================================================================
--- build/vs2019win10/OpenMPT-WineWrapper.vcxproj	(revision 14628)
+++ build/vs2019win10/OpenMPT-WineWrapper.vcxproj	(working copy)
@@ -543,7 +543,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -567,7 +567,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -591,7 +591,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -614,7 +614,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -637,7 +637,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -667,7 +667,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -696,7 +696,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -725,7 +725,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -754,7 +754,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -784,7 +784,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -813,7 +813,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -842,7 +842,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -871,7 +871,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -894,7 +894,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -917,7 +917,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -940,7 +940,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -963,7 +963,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -993,7 +993,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1022,7 +1022,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1051,7 +1051,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1080,7 +1080,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1110,7 +1110,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1139,7 +1139,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1168,7 +1168,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
Index: build/vs2019win10/OpenMPT.vcxproj
===================================================================
--- build/vs2019win10/OpenMPT.vcxproj	(revision 14628)
+++ build/vs2019win10/OpenMPT.vcxproj	(working copy)
@@ -568,7 +568,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -580,7 +580,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -603,7 +603,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -615,7 +615,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -638,7 +638,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -650,7 +650,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -672,7 +672,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -684,7 +684,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -706,7 +706,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -723,7 +723,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -747,7 +747,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -763,7 +763,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -787,7 +787,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -803,7 +803,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -827,7 +827,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -843,7 +843,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -867,7 +867,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -884,7 +884,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -908,7 +908,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -924,7 +924,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -948,7 +948,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -964,7 +964,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -988,7 +988,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1004,7 +1004,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1028,7 +1028,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1040,7 +1040,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1062,7 +1062,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1074,7 +1074,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1096,7 +1096,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1108,7 +1108,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1130,7 +1130,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1142,7 +1142,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1164,7 +1164,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1181,7 +1181,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1205,7 +1205,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1221,7 +1221,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1245,7 +1245,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1261,7 +1261,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1285,7 +1285,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1301,7 +1301,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1325,7 +1325,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1342,7 +1342,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1366,7 +1366,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1382,7 +1382,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1406,7 +1406,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1422,7 +1422,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1446,7 +1446,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1462,7 +1462,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1744,6 +1744,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1780,8 +1882,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -2019,6 +2119,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win10/OpenMPT.vcxproj.filters
===================================================================
--- build/vs2019win10/OpenMPT.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/OpenMPT.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win10/openmpt123.vcxproj
===================================================================
--- build/vs2019win10/openmpt123.vcxproj	(revision 14628)
+++ build/vs2019win10/openmpt123.vcxproj	(working copy)
@@ -543,7 +543,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -554,7 +554,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -572,7 +572,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -583,7 +583,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -601,7 +601,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -612,7 +612,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -629,7 +629,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -640,7 +640,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -657,7 +657,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -673,7 +673,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -692,7 +692,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -707,7 +707,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -726,7 +726,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -741,7 +741,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -760,7 +760,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -775,7 +775,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -794,7 +794,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -810,7 +810,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -829,7 +829,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -844,7 +844,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -863,7 +863,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -878,7 +878,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -897,7 +897,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -912,7 +912,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -931,7 +931,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -942,7 +942,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -959,7 +959,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -970,7 +970,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -987,7 +987,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -998,7 +998,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1015,7 +1015,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1026,7 +1026,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1043,7 +1043,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1059,7 +1059,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1078,7 +1078,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1093,7 +1093,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1112,7 +1112,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1127,7 +1127,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1146,7 +1146,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1161,7 +1161,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1180,7 +1180,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1196,7 +1196,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1215,7 +1215,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1230,7 +1230,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1249,7 +1249,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1264,7 +1264,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1283,7 +1283,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1298,7 +1298,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1325,6 +1325,57 @@
     <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
Index: build/vs2019win10/openmpt123.vcxproj.filters
===================================================================
--- build/vs2019win10/openmpt123.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/openmpt123.vcxproj.filters	(working copy)
@@ -4,23 +4,220 @@
     <Filter Include="libopenmpt">
       <UniqueIdentifier>{FFE9848F-EBA1-C6DC-54A9-9F38408061CD}</UniqueIdentifier>
     </Filter>
+    <Filter Include="openmpt123">
+      <UniqueIdentifier>{BECCA03C-AA84-E289-138C-BBE5FF627D7A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="..\..\openmpt123\openmpt123.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\openmpt123\openmpt123.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
+    <ClCompile Include="..\..\openmpt123\openmpt123.cpp">
+      <Filter>openmpt123</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\libopenmpt\libopenmpt_version.rc">
Index: build/vs2019win10/PluginBridge.vcxproj
===================================================================
--- build/vs2019win10/PluginBridge.vcxproj	(revision 14628)
+++ build/vs2019win10/PluginBridge.vcxproj	(working copy)
@@ -543,7 +543,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -554,7 +554,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -575,7 +575,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -586,7 +586,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -607,7 +607,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -618,7 +618,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -638,7 +638,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -649,7 +649,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -669,7 +669,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -685,7 +685,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -707,7 +707,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -722,7 +722,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -744,7 +744,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -759,7 +759,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -781,7 +781,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -796,7 +796,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -818,7 +818,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -834,7 +834,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -856,7 +856,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -871,7 +871,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -893,7 +893,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -908,7 +908,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -930,7 +930,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -945,7 +945,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -967,7 +967,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -978,7 +978,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -998,7 +998,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1009,7 +1009,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1029,7 +1029,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1040,7 +1040,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1060,7 +1060,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1071,7 +1071,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1091,7 +1091,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1107,7 +1107,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1129,7 +1129,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1144,7 +1144,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1166,7 +1166,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1181,7 +1181,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1203,7 +1203,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1218,7 +1218,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1240,7 +1240,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1256,7 +1256,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1278,7 +1278,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1293,7 +1293,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1315,7 +1315,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1330,7 +1330,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1352,7 +1352,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1367,7 +1367,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1391,6 +1391,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2019win10/PluginBridge.vcxproj.filters
===================================================================
--- build/vs2019win10/PluginBridge.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/PluginBridge.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2019win10/PluginBridgeLegacy.vcxproj
===================================================================
--- build/vs2019win10/PluginBridgeLegacy.vcxproj	(revision 14628)
+++ build/vs2019win10/PluginBridgeLegacy.vcxproj	(working copy)
@@ -543,7 +543,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -554,7 +554,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -575,7 +575,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -586,7 +586,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -608,7 +608,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -619,7 +619,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -638,7 +638,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -649,7 +649,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -669,7 +669,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -685,7 +685,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -707,7 +707,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -722,7 +722,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -745,7 +745,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -760,7 +760,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -781,7 +781,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -796,7 +796,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -818,7 +818,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -834,7 +834,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -856,7 +856,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -871,7 +871,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -894,7 +894,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -909,7 +909,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -930,7 +930,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -945,7 +945,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -967,7 +967,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -978,7 +978,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -998,7 +998,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1009,7 +1009,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1030,7 +1030,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1041,7 +1041,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1060,7 +1060,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1071,7 +1071,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1091,7 +1091,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1107,7 +1107,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1129,7 +1129,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1144,7 +1144,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1167,7 +1167,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1182,7 +1182,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1203,7 +1203,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1218,7 +1218,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1240,7 +1240,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1256,7 +1256,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1278,7 +1278,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1293,7 +1293,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1316,7 +1316,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1331,7 +1331,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1352,7 +1352,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1367,7 +1367,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1391,6 +1391,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2019win10/PluginBridgeLegacy.vcxproj.filters
===================================================================
--- build/vs2019win10/PluginBridgeLegacy.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/PluginBridgeLegacy.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2019win10/signtool.vcxproj
===================================================================
--- build/vs2019win10/signtool.vcxproj	(revision 14628)
+++ build/vs2019win10/signtool.vcxproj	(working copy)
@@ -543,7 +543,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -567,7 +567,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -591,7 +591,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -614,7 +614,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -637,7 +637,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -667,7 +667,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -696,7 +696,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -725,7 +725,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -754,7 +754,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -784,7 +784,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -813,7 +813,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -842,7 +842,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -871,7 +871,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -894,7 +894,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -917,7 +917,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -940,7 +940,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -963,7 +963,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -993,7 +993,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1022,7 +1022,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1051,7 +1051,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1080,7 +1080,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1110,7 +1110,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1139,7 +1139,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1168,7 +1168,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1240,6 +1240,108 @@
     <ClInclude Include="..\..\misc\mptCrypto.h" />
     <ClInclude Include="..\..\misc\mptUUIDNamespace.h" />
     <ClInclude Include="..\..\misc\mptWine.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -1264,8 +1366,6 @@
     <ClCompile Include="..\..\installer\signtool\signtool.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2019win10/signtool.vcxproj.filters
===================================================================
--- build/vs2019win10/signtool.vcxproj.filters	(revision 14628)
+++ build/vs2019win10/signtool.vcxproj.filters	(working copy)
@@ -13,6 +13,96 @@
     <Filter Include="misc">
       <UniqueIdentifier>{B1A29A7C-9DD9-9B0D-46C6-811032DC170F}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -156,6 +246,312 @@
     <ClInclude Include="..\..\misc\mptWine.h">
       <Filter>misc</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -224,12 +620,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2019win10clangcl/libopenmpt-small.vcxproj
===================================================================
--- build/vs2019win10clangcl/libopenmpt-small.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/libopenmpt-small.vcxproj	(working copy)
@@ -499,7 +499,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -522,7 +522,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -545,7 +545,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -567,7 +567,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -589,7 +589,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -618,7 +618,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -646,7 +646,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -674,7 +674,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -702,7 +702,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -731,7 +731,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -759,7 +759,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -787,7 +787,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -815,7 +815,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -826,7 +826,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -842,7 +842,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -853,7 +853,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -869,7 +869,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -880,7 +880,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -896,7 +896,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -907,7 +907,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -923,7 +923,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -939,7 +939,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -957,7 +957,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -972,7 +972,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -990,7 +990,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1005,7 +1005,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1023,7 +1023,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1038,7 +1038,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1056,7 +1056,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1072,7 +1072,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1090,7 +1090,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1105,7 +1105,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1123,7 +1123,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1138,7 +1138,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1156,7 +1156,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1171,7 +1171,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1319,6 +1319,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2019win10clangcl/libopenmpt-small.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/libopenmpt-small.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/libopenmpt-small.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2019win10clangcl/libopenmpt.vcxproj
===================================================================
--- build/vs2019win10clangcl/libopenmpt.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/libopenmpt.vcxproj	(working copy)
@@ -499,7 +499,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -522,7 +522,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -545,7 +545,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -567,7 +567,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -589,7 +589,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -618,7 +618,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -646,7 +646,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -674,7 +674,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -702,7 +702,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -731,7 +731,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -759,7 +759,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -787,7 +787,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -815,7 +815,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -826,7 +826,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -842,7 +842,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -853,7 +853,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -869,7 +869,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -880,7 +880,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -896,7 +896,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -907,7 +907,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -923,7 +923,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -939,7 +939,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -957,7 +957,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -972,7 +972,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -990,7 +990,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1005,7 +1005,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1023,7 +1023,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1038,7 +1038,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1056,7 +1056,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1072,7 +1072,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1090,7 +1090,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1105,7 +1105,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1123,7 +1123,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1138,7 +1138,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1156,7 +1156,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1171,7 +1171,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1319,6 +1319,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2019win10clangcl/libopenmpt.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/libopenmpt.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/libopenmpt.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2019win10clangcl/libopenmpt_test.vcxproj
===================================================================
--- build/vs2019win10clangcl/libopenmpt_test.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/libopenmpt_test.vcxproj	(working copy)
@@ -265,7 +265,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -288,7 +288,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -311,7 +311,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -333,7 +333,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -355,7 +355,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -384,7 +384,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -412,7 +412,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -440,7 +440,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -468,7 +468,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -497,7 +497,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -525,7 +525,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -553,7 +553,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -711,6 +711,101 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -855,6 +950,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2019win10clangcl/libopenmpt_test.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/libopenmpt_test.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/libopenmpt_test.vcxproj.filters	(working copy)
@@ -22,6 +22,81 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -429,6 +504,291 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -857,6 +1217,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win10clangcl/OpenMPT-ANSI.vcxproj
===================================================================
--- build/vs2019win10clangcl/OpenMPT-ANSI.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/OpenMPT-ANSI.vcxproj	(working copy)
@@ -536,7 +536,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -548,7 +548,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -571,7 +571,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -583,7 +583,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -606,7 +606,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -618,7 +618,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -640,7 +640,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -652,7 +652,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -674,7 +674,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -691,7 +691,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -715,7 +715,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -731,7 +731,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -755,7 +755,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -771,7 +771,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -795,7 +795,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -811,7 +811,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -835,7 +835,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -852,7 +852,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -876,7 +876,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -892,7 +892,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -916,7 +916,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -932,7 +932,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -956,7 +956,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -972,7 +972,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -996,7 +996,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1008,7 +1008,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1030,7 +1030,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1042,7 +1042,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1064,7 +1064,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1076,7 +1076,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1098,7 +1098,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1110,7 +1110,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1132,7 +1132,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1149,7 +1149,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1173,7 +1173,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1189,7 +1189,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1213,7 +1213,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1229,7 +1229,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1253,7 +1253,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1269,7 +1269,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1293,7 +1293,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1310,7 +1310,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1334,7 +1334,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1350,7 +1350,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1374,7 +1374,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1390,7 +1390,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1414,7 +1414,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1430,7 +1430,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1712,6 +1712,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1748,8 +1850,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1987,6 +2087,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win10clangcl/OpenMPT-ANSI.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/OpenMPT-ANSI.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/OpenMPT-ANSI.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win10clangcl/OpenMPT-NativeSupport.vcxproj
===================================================================
--- build/vs2019win10clangcl/OpenMPT-NativeSupport.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/OpenMPT-NativeSupport.vcxproj	(working copy)
@@ -511,7 +511,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -536,7 +536,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -561,7 +561,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -585,7 +585,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -609,7 +609,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -640,7 +640,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -670,7 +670,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -700,7 +700,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -730,7 +730,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -761,7 +761,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -791,7 +791,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -821,7 +821,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -851,7 +851,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -875,7 +875,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -899,7 +899,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -923,7 +923,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -947,7 +947,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -978,7 +978,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1008,7 +1008,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1038,7 +1038,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1068,7 +1068,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1099,7 +1099,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1129,7 +1129,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1159,7 +1159,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1267,6 +1267,108 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceStub.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceUtilities.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -1290,8 +1392,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\wine\Native.cpp" />
     <ClCompile Include="..\..\mptrack\wine\NativeSoundDevice.cpp" />
Index: build/vs2019win10clangcl/OpenMPT-NativeSupport.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/OpenMPT-NativeSupport.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/OpenMPT-NativeSupport.vcxproj.filters	(working copy)
@@ -31,6 +31,96 @@
     <Filter Include="sounddev">
       <UniqueIdentifier>{8DE8B016-79B5-0B22-A2CE-F9C98EFA40B0}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -279,6 +369,312 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h">
       <Filter>sounddev</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -344,12 +740,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2019win10clangcl/OpenMPT-UTF8.vcxproj
===================================================================
--- build/vs2019win10clangcl/OpenMPT-UTF8.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/OpenMPT-UTF8.vcxproj	(working copy)
@@ -536,7 +536,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -548,7 +548,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -571,7 +571,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -583,7 +583,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -606,7 +606,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -618,7 +618,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -640,7 +640,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -652,7 +652,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -674,7 +674,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -691,7 +691,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -715,7 +715,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -731,7 +731,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -755,7 +755,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -771,7 +771,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -795,7 +795,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -811,7 +811,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -835,7 +835,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -852,7 +852,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -876,7 +876,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -892,7 +892,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -916,7 +916,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -932,7 +932,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -956,7 +956,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -972,7 +972,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -996,7 +996,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1008,7 +1008,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1030,7 +1030,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1042,7 +1042,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1064,7 +1064,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1076,7 +1076,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1098,7 +1098,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1110,7 +1110,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1132,7 +1132,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1149,7 +1149,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1173,7 +1173,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1189,7 +1189,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1213,7 +1213,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1229,7 +1229,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1253,7 +1253,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1269,7 +1269,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1293,7 +1293,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1310,7 +1310,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1334,7 +1334,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1350,7 +1350,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1374,7 +1374,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1390,7 +1390,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1414,7 +1414,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1430,7 +1430,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1712,6 +1712,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1748,8 +1850,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1987,6 +2087,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win10clangcl/OpenMPT-UTF8.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/OpenMPT-UTF8.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/OpenMPT-UTF8.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win10clangcl/OpenMPT-WineWrapper.vcxproj
===================================================================
--- build/vs2019win10clangcl/OpenMPT-WineWrapper.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/OpenMPT-WineWrapper.vcxproj	(working copy)
@@ -511,7 +511,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -535,7 +535,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -559,7 +559,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -582,7 +582,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -605,7 +605,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -635,7 +635,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -664,7 +664,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -693,7 +693,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -722,7 +722,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -752,7 +752,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -781,7 +781,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -810,7 +810,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -839,7 +839,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -862,7 +862,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -885,7 +885,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -908,7 +908,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -931,7 +931,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -961,7 +961,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -990,7 +990,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1019,7 +1019,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1048,7 +1048,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1078,7 +1078,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1107,7 +1107,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1136,7 +1136,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
Index: build/vs2019win10clangcl/OpenMPT.vcxproj
===================================================================
--- build/vs2019win10clangcl/OpenMPT.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/OpenMPT.vcxproj	(working copy)
@@ -536,7 +536,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -548,7 +548,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -571,7 +571,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -583,7 +583,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -606,7 +606,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -618,7 +618,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -640,7 +640,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -652,7 +652,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -674,7 +674,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -691,7 +691,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -715,7 +715,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -731,7 +731,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -755,7 +755,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -771,7 +771,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -795,7 +795,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -811,7 +811,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -835,7 +835,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -852,7 +852,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -876,7 +876,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -892,7 +892,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -916,7 +916,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -932,7 +932,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -956,7 +956,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -972,7 +972,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -996,7 +996,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1008,7 +1008,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1030,7 +1030,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1042,7 +1042,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1064,7 +1064,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1076,7 +1076,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1098,7 +1098,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -1110,7 +1110,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1132,7 +1132,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1149,7 +1149,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1173,7 +1173,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1189,7 +1189,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1213,7 +1213,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1229,7 +1229,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1253,7 +1253,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -1269,7 +1269,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1293,7 +1293,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1310,7 +1310,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1334,7 +1334,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1350,7 +1350,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1374,7 +1374,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1390,7 +1390,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1414,7 +1414,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -1430,7 +1430,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1712,6 +1712,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1748,8 +1850,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1987,6 +2087,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win10clangcl/OpenMPT.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/OpenMPT.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/OpenMPT.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win10clangcl/openmpt123.vcxproj
===================================================================
--- build/vs2019win10clangcl/openmpt123.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/openmpt123.vcxproj	(working copy)
@@ -511,7 +511,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -522,7 +522,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -540,7 +540,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -551,7 +551,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -569,7 +569,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -580,7 +580,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -597,7 +597,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -608,7 +608,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -625,7 +625,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -641,7 +641,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -660,7 +660,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -675,7 +675,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -694,7 +694,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -709,7 +709,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -728,7 +728,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -743,7 +743,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -762,7 +762,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -778,7 +778,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -797,7 +797,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -812,7 +812,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -831,7 +831,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -846,7 +846,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -865,7 +865,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -880,7 +880,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -899,7 +899,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -910,7 +910,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -927,7 +927,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -938,7 +938,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -955,7 +955,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -966,7 +966,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -983,7 +983,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -994,7 +994,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1011,7 +1011,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1027,7 +1027,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1046,7 +1046,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1061,7 +1061,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1080,7 +1080,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1095,7 +1095,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1114,7 +1114,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1129,7 +1129,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1148,7 +1148,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1164,7 +1164,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1183,7 +1183,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1198,7 +1198,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1217,7 +1217,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1232,7 +1232,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1251,7 +1251,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1266,7 +1266,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"arm64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -1293,6 +1293,57 @@
     <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
Index: build/vs2019win10clangcl/openmpt123.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/openmpt123.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/openmpt123.vcxproj.filters	(working copy)
@@ -4,23 +4,220 @@
     <Filter Include="libopenmpt">
       <UniqueIdentifier>{FFE9848F-EBA1-C6DC-54A9-9F38408061CD}</UniqueIdentifier>
     </Filter>
+    <Filter Include="openmpt123">
+      <UniqueIdentifier>{BECCA03C-AA84-E289-138C-BBE5FF627D7A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="..\..\openmpt123\openmpt123.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\openmpt123\openmpt123.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
+    <ClCompile Include="..\..\openmpt123\openmpt123.cpp">
+      <Filter>openmpt123</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\libopenmpt\libopenmpt_version.rc">
Index: build/vs2019win10clangcl/PluginBridge.vcxproj
===================================================================
--- build/vs2019win10clangcl/PluginBridge.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/PluginBridge.vcxproj	(working copy)
@@ -511,7 +511,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -522,7 +522,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -543,7 +543,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -554,7 +554,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -575,7 +575,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -586,7 +586,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -606,7 +606,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -617,7 +617,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -637,7 +637,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -653,7 +653,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -675,7 +675,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -690,7 +690,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -712,7 +712,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -727,7 +727,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -749,7 +749,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -764,7 +764,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -786,7 +786,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -802,7 +802,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -824,7 +824,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -839,7 +839,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -861,7 +861,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -876,7 +876,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -898,7 +898,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -913,7 +913,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -935,7 +935,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -946,7 +946,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -966,7 +966,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -977,7 +977,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -997,7 +997,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1008,7 +1008,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1028,7 +1028,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1039,7 +1039,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1059,7 +1059,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1075,7 +1075,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1097,7 +1097,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1112,7 +1112,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1134,7 +1134,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1149,7 +1149,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1171,7 +1171,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1186,7 +1186,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1208,7 +1208,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1224,7 +1224,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1246,7 +1246,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1261,7 +1261,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1283,7 +1283,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1298,7 +1298,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1320,7 +1320,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1335,7 +1335,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1359,6 +1359,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2019win10clangcl/PluginBridge.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/PluginBridge.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/PluginBridge.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2019win10clangcl/PluginBridgeLegacy.vcxproj
===================================================================
--- build/vs2019win10clangcl/PluginBridgeLegacy.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/PluginBridgeLegacy.vcxproj	(working copy)
@@ -511,7 +511,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -522,7 +522,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -543,7 +543,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -554,7 +554,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -576,7 +576,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -587,7 +587,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -606,7 +606,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -617,7 +617,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -637,7 +637,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -653,7 +653,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -675,7 +675,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -690,7 +690,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -713,7 +713,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -728,7 +728,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -749,7 +749,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -764,7 +764,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -786,7 +786,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -802,7 +802,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -824,7 +824,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -839,7 +839,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -862,7 +862,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -877,7 +877,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -898,7 +898,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -913,7 +913,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -935,7 +935,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -946,7 +946,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -966,7 +966,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -977,7 +977,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -998,7 +998,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1009,7 +1009,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1028,7 +1028,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -1039,7 +1039,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1059,7 +1059,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1075,7 +1075,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1097,7 +1097,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1112,7 +1112,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1135,7 +1135,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1150,7 +1150,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1171,7 +1171,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1186,7 +1186,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1208,7 +1208,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1224,7 +1224,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1246,7 +1246,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1261,7 +1261,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1284,7 +1284,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1299,7 +1299,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1320,7 +1320,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1335,7 +1335,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;VER_ARCHNAME=\"arm64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1359,6 +1359,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2019win10clangcl/PluginBridgeLegacy.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/PluginBridgeLegacy.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/PluginBridgeLegacy.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2019win10clangcl/signtool.vcxproj
===================================================================
--- build/vs2019win10clangcl/signtool.vcxproj	(revision 14628)
+++ build/vs2019win10clangcl/signtool.vcxproj	(working copy)
@@ -511,7 +511,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -535,7 +535,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -559,7 +559,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -582,7 +582,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -605,7 +605,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -635,7 +635,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -664,7 +664,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -693,7 +693,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -722,7 +722,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -752,7 +752,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -781,7 +781,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -810,7 +810,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -839,7 +839,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -862,7 +862,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -885,7 +885,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -908,7 +908,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -931,7 +931,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -961,7 +961,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -990,7 +990,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1019,7 +1019,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1048,7 +1048,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1078,7 +1078,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1107,7 +1107,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1136,7 +1136,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0A00;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -1208,6 +1208,108 @@
     <ClInclude Include="..\..\misc\mptCrypto.h" />
     <ClInclude Include="..\..\misc\mptUUIDNamespace.h" />
     <ClInclude Include="..\..\misc\mptWine.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -1232,8 +1334,6 @@
     <ClCompile Include="..\..\installer\signtool\signtool.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2019win10clangcl/signtool.vcxproj.filters
===================================================================
--- build/vs2019win10clangcl/signtool.vcxproj.filters	(revision 14628)
+++ build/vs2019win10clangcl/signtool.vcxproj.filters	(working copy)
@@ -13,6 +13,96 @@
     <Filter Include="misc">
       <UniqueIdentifier>{B1A29A7C-9DD9-9B0D-46C6-811032DC170F}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -156,6 +246,312 @@
     <ClInclude Include="..\..\misc\mptWine.h">
       <Filter>misc</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -224,12 +620,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2019win7/libopenmpt-small.vcxproj
===================================================================
--- build/vs2019win7/libopenmpt-small.vcxproj	(revision 14628)
+++ build/vs2019win7/libopenmpt-small.vcxproj	(working copy)
@@ -269,7 +269,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -292,7 +292,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -315,7 +315,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -344,7 +344,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -372,7 +372,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -401,7 +401,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -429,7 +429,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -440,7 +440,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -456,7 +456,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -467,7 +467,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -483,7 +483,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -499,7 +499,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -517,7 +517,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -532,7 +532,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -550,7 +550,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -566,7 +566,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -584,7 +584,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -599,7 +599,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -747,6 +747,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2019win7/libopenmpt-small.vcxproj.filters
===================================================================
--- build/vs2019win7/libopenmpt-small.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/libopenmpt-small.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2019win7/libopenmpt.vcxproj
===================================================================
--- build/vs2019win7/libopenmpt.vcxproj	(revision 14628)
+++ build/vs2019win7/libopenmpt.vcxproj	(working copy)
@@ -269,7 +269,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -292,7 +292,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -315,7 +315,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -344,7 +344,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -372,7 +372,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -401,7 +401,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -429,7 +429,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -440,7 +440,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -456,7 +456,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -467,7 +467,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -483,7 +483,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -499,7 +499,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -517,7 +517,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -532,7 +532,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -550,7 +550,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -566,7 +566,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -584,7 +584,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -599,7 +599,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -747,6 +747,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2019win7/libopenmpt.vcxproj.filters
===================================================================
--- build/vs2019win7/libopenmpt.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/libopenmpt.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2019win7/libopenmpt_test.vcxproj
===================================================================
--- build/vs2019win7/libopenmpt_test.vcxproj	(revision 14628)
+++ build/vs2019win7/libopenmpt_test.vcxproj	(working copy)
@@ -147,7 +147,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -170,7 +170,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -193,7 +193,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -222,7 +222,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -250,7 +250,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -279,7 +279,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -437,6 +437,101 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -581,6 +676,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2019win7/libopenmpt_test.vcxproj.filters
===================================================================
--- build/vs2019win7/libopenmpt_test.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/libopenmpt_test.vcxproj.filters	(working copy)
@@ -22,6 +22,81 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -429,6 +504,291 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -857,6 +1217,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win7/OpenMPT-ANSI.vcxproj
===================================================================
--- build/vs2019win7/OpenMPT-ANSI.vcxproj	(revision 14628)
+++ build/vs2019win7/OpenMPT-ANSI.vcxproj	(working copy)
@@ -288,7 +288,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -300,7 +300,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -323,7 +323,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -335,7 +335,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -358,7 +358,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -375,7 +375,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -399,7 +399,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -415,7 +415,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -439,7 +439,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -456,7 +456,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -480,7 +480,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -496,7 +496,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -520,7 +520,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -532,7 +532,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -554,7 +554,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -566,7 +566,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -588,7 +588,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -605,7 +605,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -629,7 +629,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -645,7 +645,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -669,7 +669,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -686,7 +686,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -710,7 +710,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -726,7 +726,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1008,6 +1008,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1044,8 +1146,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1283,6 +1383,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win7/OpenMPT-ANSI.vcxproj.filters
===================================================================
--- build/vs2019win7/OpenMPT-ANSI.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/OpenMPT-ANSI.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win7/OpenMPT-NativeSupport.vcxproj
===================================================================
--- build/vs2019win7/OpenMPT-NativeSupport.vcxproj	(revision 14628)
+++ build/vs2019win7/OpenMPT-NativeSupport.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -300,7 +300,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -325,7 +325,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -356,7 +356,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -386,7 +386,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -417,7 +417,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -447,7 +447,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -471,7 +471,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -495,7 +495,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -526,7 +526,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -556,7 +556,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -587,7 +587,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -695,6 +695,108 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceStub.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceUtilities.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -718,8 +820,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\wine\Native.cpp" />
     <ClCompile Include="..\..\mptrack\wine\NativeSoundDevice.cpp" />
Index: build/vs2019win7/OpenMPT-NativeSupport.vcxproj.filters
===================================================================
--- build/vs2019win7/OpenMPT-NativeSupport.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/OpenMPT-NativeSupport.vcxproj.filters	(working copy)
@@ -31,6 +31,96 @@
     <Filter Include="sounddev">
       <UniqueIdentifier>{8DE8B016-79B5-0B22-A2CE-F9C98EFA40B0}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -279,6 +369,312 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h">
       <Filter>sounddev</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -344,12 +740,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2019win7/OpenMPT-UTF8.vcxproj
===================================================================
--- build/vs2019win7/OpenMPT-UTF8.vcxproj	(revision 14628)
+++ build/vs2019win7/OpenMPT-UTF8.vcxproj	(working copy)
@@ -288,7 +288,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -300,7 +300,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -323,7 +323,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -335,7 +335,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -358,7 +358,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -375,7 +375,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -399,7 +399,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -415,7 +415,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -439,7 +439,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -456,7 +456,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -480,7 +480,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -496,7 +496,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -520,7 +520,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -532,7 +532,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -554,7 +554,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -566,7 +566,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -588,7 +588,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -605,7 +605,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -629,7 +629,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -645,7 +645,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -669,7 +669,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -686,7 +686,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -710,7 +710,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -726,7 +726,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1008,6 +1008,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1044,8 +1146,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1283,6 +1383,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win7/OpenMPT-UTF8.vcxproj.filters
===================================================================
--- build/vs2019win7/OpenMPT-UTF8.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/OpenMPT-UTF8.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win7/OpenMPT-WineWrapper.vcxproj
===================================================================
--- build/vs2019win7/OpenMPT-WineWrapper.vcxproj	(revision 14628)
+++ build/vs2019win7/OpenMPT-WineWrapper.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -299,7 +299,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -323,7 +323,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -353,7 +353,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -382,7 +382,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -412,7 +412,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -441,7 +441,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -464,7 +464,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -487,7 +487,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -517,7 +517,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -546,7 +546,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -576,7 +576,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
Index: build/vs2019win7/OpenMPT.vcxproj
===================================================================
--- build/vs2019win7/OpenMPT.vcxproj	(revision 14628)
+++ build/vs2019win7/OpenMPT.vcxproj	(working copy)
@@ -288,7 +288,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -300,7 +300,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -323,7 +323,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -335,7 +335,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -358,7 +358,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -375,7 +375,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -399,7 +399,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -415,7 +415,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -439,7 +439,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -456,7 +456,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -480,7 +480,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -496,7 +496,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -520,7 +520,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -532,7 +532,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -554,7 +554,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -566,7 +566,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -588,7 +588,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -605,7 +605,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -629,7 +629,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -645,7 +645,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -669,7 +669,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -686,7 +686,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -710,7 +710,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -726,7 +726,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1008,6 +1008,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1044,8 +1146,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1283,6 +1383,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win7/OpenMPT.vcxproj.filters
===================================================================
--- build/vs2019win7/OpenMPT.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/OpenMPT.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win7/openmpt123.vcxproj
===================================================================
--- build/vs2019win7/openmpt123.vcxproj	(revision 14628)
+++ build/vs2019win7/openmpt123.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -286,7 +286,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -304,7 +304,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -315,7 +315,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -333,7 +333,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -349,7 +349,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -368,7 +368,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -383,7 +383,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -402,7 +402,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -418,7 +418,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -437,7 +437,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -452,7 +452,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -471,7 +471,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -482,7 +482,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -499,7 +499,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -510,7 +510,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -527,7 +527,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -543,7 +543,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -562,7 +562,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -577,7 +577,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -596,7 +596,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -612,7 +612,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -631,7 +631,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -646,7 +646,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -673,6 +673,57 @@
     <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
Index: build/vs2019win7/openmpt123.vcxproj.filters
===================================================================
--- build/vs2019win7/openmpt123.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/openmpt123.vcxproj.filters	(working copy)
@@ -4,23 +4,220 @@
     <Filter Include="libopenmpt">
       <UniqueIdentifier>{FFE9848F-EBA1-C6DC-54A9-9F38408061CD}</UniqueIdentifier>
     </Filter>
+    <Filter Include="openmpt123">
+      <UniqueIdentifier>{BECCA03C-AA84-E289-138C-BBE5FF627D7A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="..\..\openmpt123\openmpt123.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\openmpt123\openmpt123.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
+    <ClCompile Include="..\..\openmpt123\openmpt123.cpp">
+      <Filter>openmpt123</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\libopenmpt\libopenmpt_version.rc">
Index: build/vs2019win7/PluginBridge.vcxproj
===================================================================
--- build/vs2019win7/PluginBridge.vcxproj	(revision 14628)
+++ build/vs2019win7/PluginBridge.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -286,7 +286,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -307,7 +307,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -318,7 +318,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -339,7 +339,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -355,7 +355,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -377,7 +377,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -392,7 +392,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -414,7 +414,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -430,7 +430,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -452,7 +452,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -467,7 +467,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -489,7 +489,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -500,7 +500,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -520,7 +520,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -531,7 +531,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -551,7 +551,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -567,7 +567,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -589,7 +589,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -604,7 +604,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -626,7 +626,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -642,7 +642,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -664,7 +664,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -679,7 +679,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -703,6 +703,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2019win7/PluginBridge.vcxproj.filters
===================================================================
--- build/vs2019win7/PluginBridge.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/PluginBridge.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2019win7/PluginBridgeLegacy.vcxproj
===================================================================
--- build/vs2019win7/PluginBridgeLegacy.vcxproj	(revision 14628)
+++ build/vs2019win7/PluginBridgeLegacy.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -286,7 +286,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -307,7 +307,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -318,7 +318,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -340,7 +340,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -356,7 +356,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -378,7 +378,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -393,7 +393,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -416,7 +416,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -432,7 +432,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -454,7 +454,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -469,7 +469,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -492,7 +492,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -503,7 +503,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -523,7 +523,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -534,7 +534,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -555,7 +555,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -571,7 +571,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -593,7 +593,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -608,7 +608,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -631,7 +631,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -647,7 +647,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -669,7 +669,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -684,7 +684,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -709,6 +709,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2019win7/PluginBridgeLegacy.vcxproj.filters
===================================================================
--- build/vs2019win7/PluginBridgeLegacy.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/PluginBridgeLegacy.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2019win7/signtool.vcxproj
===================================================================
--- build/vs2019win7/signtool.vcxproj	(revision 14628)
+++ build/vs2019win7/signtool.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -299,7 +299,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -323,7 +323,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -353,7 +353,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -382,7 +382,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -412,7 +412,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -441,7 +441,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -464,7 +464,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -487,7 +487,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -517,7 +517,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -546,7 +546,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -576,7 +576,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0601;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -648,6 +648,108 @@
     <ClInclude Include="..\..\misc\mptCrypto.h" />
     <ClInclude Include="..\..\misc\mptUUIDNamespace.h" />
     <ClInclude Include="..\..\misc\mptWine.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -672,8 +774,6 @@
     <ClCompile Include="..\..\installer\signtool\signtool.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2019win7/signtool.vcxproj.filters
===================================================================
--- build/vs2019win7/signtool.vcxproj.filters	(revision 14628)
+++ build/vs2019win7/signtool.vcxproj.filters	(working copy)
@@ -13,6 +13,96 @@
     <Filter Include="misc">
       <UniqueIdentifier>{B1A29A7C-9DD9-9B0D-46C6-811032DC170F}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -156,6 +246,312 @@
     <ClInclude Include="..\..\misc\mptWine.h">
       <Filter>misc</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -224,12 +620,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2019win81/libopenmpt-small.vcxproj
===================================================================
--- build/vs2019win81/libopenmpt-small.vcxproj	(revision 14628)
+++ build/vs2019win81/libopenmpt-small.vcxproj	(working copy)
@@ -269,7 +269,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -292,7 +292,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -315,7 +315,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -344,7 +344,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -372,7 +372,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -401,7 +401,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -429,7 +429,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -440,7 +440,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -456,7 +456,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -467,7 +467,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -483,7 +483,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -499,7 +499,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -517,7 +517,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -532,7 +532,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -550,7 +550,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -566,7 +566,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -584,7 +584,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -599,7 +599,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_SMALL;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_SPECIAL_PREFIX=\"+small\";MPT_BUILD_VER_FILENAME=\"libopenmpt-small.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt-small\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -747,6 +747,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2019win81/libopenmpt-small.vcxproj.filters
===================================================================
--- build/vs2019win81/libopenmpt-small.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/libopenmpt-small.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2019win81/libopenmpt.vcxproj
===================================================================
--- build/vs2019win81/libopenmpt.vcxproj	(revision 14628)
+++ build/vs2019win81/libopenmpt.vcxproj	(working copy)
@@ -269,7 +269,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -292,7 +292,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -315,7 +315,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -344,7 +344,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -372,7 +372,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -401,7 +401,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -429,7 +429,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -440,7 +440,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -456,7 +456,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -467,7 +467,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -483,7 +483,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -499,7 +499,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -517,7 +517,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -532,7 +532,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -550,7 +550,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -566,7 +566,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -584,7 +584,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -599,7 +599,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"libopenmpt.dll\";MPT_BUILD_VER_FILEDESC=\"libopenmpt\";MPT_BUILD_VER_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -747,6 +747,99 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
Index: build/vs2019win81/libopenmpt.vcxproj.filters
===================================================================
--- build/vs2019win81/libopenmpt.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/libopenmpt.vcxproj.filters	(working copy)
@@ -22,6 +22,78 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -426,6 +498,285 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
Index: build/vs2019win81/libopenmpt_test.vcxproj
===================================================================
--- build/vs2019win81/libopenmpt_test.vcxproj	(revision 14628)
+++ build/vs2019win81/libopenmpt_test.vcxproj	(working copy)
@@ -147,7 +147,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -170,7 +170,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -193,7 +193,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -222,7 +222,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -250,7 +250,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -279,7 +279,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_BUILD;LIBOPENMPT_BUILD_TEST;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\ogg\include;..\..\include\vorbis\include;..\..\include\zlib;..\..;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -437,6 +437,101 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -581,6 +676,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2019win81/libopenmpt_test.vcxproj.filters
===================================================================
--- build/vs2019win81/libopenmpt_test.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/libopenmpt_test.vcxproj.filters	(working copy)
@@ -22,6 +22,81 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -429,6 +504,291 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -857,6 +1217,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win81/OpenMPT-ANSI.vcxproj
===================================================================
--- build/vs2019win81/OpenMPT-ANSI.vcxproj	(revision 14628)
+++ build/vs2019win81/OpenMPT-ANSI.vcxproj	(working copy)
@@ -288,7 +288,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -300,7 +300,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -323,7 +323,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -335,7 +335,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -358,7 +358,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -375,7 +375,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -399,7 +399,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -415,7 +415,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -439,7 +439,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -456,7 +456,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -480,7 +480,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -496,7 +496,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -520,7 +520,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -532,7 +532,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -554,7 +554,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -566,7 +566,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -588,7 +588,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -605,7 +605,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -629,7 +629,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -645,7 +645,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -669,7 +669,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -686,7 +686,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -710,7 +710,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -726,7 +726,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;NO_WARN_MBCS_MFC_DEPRECATION;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1008,6 +1008,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1044,8 +1146,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1283,6 +1383,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win81/OpenMPT-ANSI.vcxproj.filters
===================================================================
--- build/vs2019win81/OpenMPT-ANSI.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/OpenMPT-ANSI.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win81/OpenMPT-NativeSupport.vcxproj
===================================================================
--- build/vs2019win81/OpenMPT-NativeSupport.vcxproj	(revision 14628)
+++ build/vs2019win81/OpenMPT-NativeSupport.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -300,7 +300,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -325,7 +325,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -356,7 +356,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -386,7 +386,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -417,7 +417,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -447,7 +447,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -471,7 +471,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -495,7 +495,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -526,7 +526,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -556,7 +556,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -587,7 +587,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\nlohmann-json\include;..\..\include\portaudio\include;..\..\include\rtaudio;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -695,6 +695,108 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceStub.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceUtilities.h" />
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -718,8 +820,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\wine\Native.cpp" />
     <ClCompile Include="..\..\mptrack\wine\NativeSoundDevice.cpp" />
Index: build/vs2019win81/OpenMPT-NativeSupport.vcxproj.filters
===================================================================
--- build/vs2019win81/OpenMPT-NativeSupport.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/OpenMPT-NativeSupport.vcxproj.filters	(working copy)
@@ -31,6 +31,96 @@
     <Filter Include="sounddev">
       <UniqueIdentifier>{8DE8B016-79B5-0B22-A2CE-F9C98EFA40B0}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -279,6 +369,312 @@
     <ClInclude Include="..\..\sounddev\SoundDeviceWaveout.h">
       <Filter>sounddev</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -344,12 +740,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/vs2019win81/OpenMPT-UTF8.vcxproj
===================================================================
--- build/vs2019win81/OpenMPT-UTF8.vcxproj	(revision 14628)
+++ build/vs2019win81/OpenMPT-UTF8.vcxproj	(working copy)
@@ -288,7 +288,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -300,7 +300,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -323,7 +323,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -335,7 +335,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -358,7 +358,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -375,7 +375,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -399,7 +399,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -415,7 +415,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -439,7 +439,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -456,7 +456,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -480,7 +480,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -496,7 +496,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -520,7 +520,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -532,7 +532,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -554,7 +554,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -566,7 +566,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -588,7 +588,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -605,7 +605,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -629,7 +629,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -645,7 +645,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -669,7 +669,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -686,7 +686,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -710,7 +710,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -726,7 +726,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;MPT_USTRING_MODE_UTF8_FORCE;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1008,6 +1008,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1044,8 +1146,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1283,6 +1383,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win81/OpenMPT-UTF8.vcxproj.filters
===================================================================
--- build/vs2019win81/OpenMPT-UTF8.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/OpenMPT-UTF8.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win81/OpenMPT-WineWrapper.vcxproj
===================================================================
--- build/vs2019win81/OpenMPT-WineWrapper.vcxproj	(revision 14628)
+++ build/vs2019win81/OpenMPT-WineWrapper.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -299,7 +299,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -323,7 +323,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -353,7 +353,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -382,7 +382,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -412,7 +412,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -441,7 +441,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -464,7 +464,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -487,7 +487,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -517,7 +517,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -546,7 +546,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -576,7 +576,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_WINESUPPORT_WRAPPER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
Index: build/vs2019win81/OpenMPT.vcxproj
===================================================================
--- build/vs2019win81/OpenMPT.vcxproj	(revision 14628)
+++ build/vs2019win81/OpenMPT.vcxproj	(working copy)
@@ -288,7 +288,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -300,7 +300,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -323,7 +323,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -335,7 +335,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -358,7 +358,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -375,7 +375,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -399,7 +399,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -415,7 +415,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -439,7 +439,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -456,7 +456,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -480,7 +480,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -496,7 +496,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -520,7 +520,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -532,7 +532,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -554,7 +554,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
@@ -566,7 +566,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -588,7 +588,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -605,7 +605,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -629,7 +629,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
@@ -645,7 +645,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -669,7 +669,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -686,7 +686,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -710,7 +710,7 @@
       <PrecompiledHeaderFile>PCH.h</PrecompiledHeaderFile>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <ForcedIncludeFiles>PCH.h</ForcedIncludeFiles>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
@@ -726,7 +726,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MPT_BUILD_ENABLE_PCH;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\include;..\..\include\asiomodern\include;..\..\include\ASIOSDK2\common;..\..\include\flac\include;..\..\include\lame\include;..\..\include\lhasa\lib\public;..\..\include\mpg123\ports\MSVC++;..\..\include\mpg123\src\libmpg123;..\..\include\nlohmann-json\include;..\..\include\ogg\include;..\..\include\opus\include;..\..\include\opusenc\include;..\..\include\opusfile\include;..\..\include\portaudio\include;..\..\include\rtaudio;..\..\include\vorbis\include;..\..\include\zlib;..\..\src;..\..\common;..\..\soundlib;$(IntDir)\svn_version;..\svn_version;..\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -1008,6 +1008,108 @@
     <ClInclude Include="..\..\soundlib\tuning.h" />
     <ClInclude Include="..\..\soundlib\tuningbase.h" />
     <ClInclude Include="..\..\soundlib\tuningcollection.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
     <ClInclude Include="..\..\test\TestTools.h" />
     <ClInclude Include="..\..\test\TestToolsLib.h" />
     <ClInclude Include="..\..\test\TestToolsTracker.h" />
@@ -1044,8 +1146,6 @@
     <ClCompile Include="..\..\common\version.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
     <ClCompile Include="..\..\mptrack\AboutDialog.cpp" />
     <ClCompile Include="..\..\mptrack\AbstractVstEditor.cpp" />
@@ -1283,6 +1383,15 @@
     <ClCompile Include="..\..\soundlib\tuning.cpp" />
     <ClCompile Include="..\..\soundlib\tuningCollection.cpp" />
     <ClCompile Include="..\..\test\TestToolsLib.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp" />
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp" />
     <ClCompile Include="..\..\test\test.cpp" />
     <ClCompile Include="..\..\tracklib\SampleEdit.cpp" />
     <ClCompile Include="..\..\unarchiver\unarchiver.cpp" />
Index: build/vs2019win81/OpenMPT.vcxproj.filters
===================================================================
--- build/vs2019win81/OpenMPT.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/OpenMPT.vcxproj.filters	(working copy)
@@ -61,6 +61,96 @@
     <Filter Include="soundlib\plugins\dmo">
       <UniqueIdentifier>{A591FA3A-9120-8404-3A3F-98FF26AD94AA}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
     <Filter Include="test">
       <UniqueIdentifier>{65689E7C-519F-9F0D-FA8B-8510E6A11B0F}</UniqueIdentifier>
     </Filter>
@@ -861,6 +951,312 @@
     <ClInclude Include="..\..\soundlib\tuningcollection.h">
       <Filter>soundlib</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\test\TestTools.h">
       <Filter>test</Filter>
     </ClInclude>
@@ -965,12 +1361,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
@@ -1682,6 +2072,33 @@
     <ClCompile Include="..\..\test\TestToolsLib.cpp">
       <Filter>test</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_base.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_binary.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crc.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_crypto.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_endian.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_random.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_string.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\test\mpt_tests_uuid_namespace.cpp">
+      <Filter>test</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\test\test.cpp">
       <Filter>test</Filter>
     </ClCompile>
Index: build/vs2019win81/openmpt123.vcxproj
===================================================================
--- build/vs2019win81/openmpt123.vcxproj	(revision 14628)
+++ build/vs2019win81/openmpt123.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -286,7 +286,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -304,7 +304,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -315,7 +315,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -333,7 +333,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -349,7 +349,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -368,7 +368,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -383,7 +383,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -402,7 +402,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -418,7 +418,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -437,7 +437,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -452,7 +452,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -471,7 +471,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -482,7 +482,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -499,7 +499,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -510,7 +510,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -527,7 +527,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -543,7 +543,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -562,7 +562,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -577,7 +577,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -596,7 +596,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -612,7 +612,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"x86\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -631,7 +631,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -646,7 +646,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;LIBOPENMPT_USE_DLL;VER_ARCHNAME=\"amd64\";MPT_BUILD_VER_FILENAME=\"openmpt123.exe\";MPT_BUILD_VER_FILEDESC=\"openmpt123\";MPT_BUILD_VER_EXE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\include\flac\include;..\..\include\portaudio\include;..\..;..\..\openmpt123;$(IntDir)\svn_version;..\svn_version;$(IntDir)\svn_version;..\svn_version;$(ProjDir)\..\..\build\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Console</SubSystem>
@@ -673,6 +673,57 @@
     <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
     <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
Index: build/vs2019win81/openmpt123.vcxproj.filters
===================================================================
--- build/vs2019win81/openmpt123.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/openmpt123.vcxproj.filters	(working copy)
@@ -4,23 +4,220 @@
     <Filter Include="libopenmpt">
       <UniqueIdentifier>{FFE9848F-EBA1-C6DC-54A9-9F38408061CD}</UniqueIdentifier>
     </Filter>
+    <Filter Include="openmpt123">
+      <UniqueIdentifier>{BECCA03C-AA84-E289-138C-BBE5FF627D7A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="..\..\openmpt123\openmpt123.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp" />
-    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp" />
+    <ClInclude Include="..\..\openmpt123\openmpt123.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_allegro42.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_config.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_flac.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_mmio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_portaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_pulseaudio.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_raw.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sdl2.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_sndfile.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_stdout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\openmpt123\openmpt123_waveout.hpp">
+      <Filter>openmpt123</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\openmpt123\openmpt123.cpp" />
+    <ClCompile Include="..\..\openmpt123\openmpt123.cpp">
+      <Filter>openmpt123</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\libopenmpt\libopenmpt_version.rc">
Index: build/vs2019win81/PluginBridge.vcxproj
===================================================================
--- build/vs2019win81/PluginBridge.vcxproj	(revision 14628)
+++ build/vs2019win81/PluginBridge.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -286,7 +286,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -307,7 +307,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -318,7 +318,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -339,7 +339,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -355,7 +355,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -377,7 +377,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -392,7 +392,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -414,7 +414,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -430,7 +430,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -452,7 +452,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -467,7 +467,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -489,7 +489,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -500,7 +500,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -520,7 +520,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -531,7 +531,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -551,7 +551,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -567,7 +567,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -589,7 +589,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -604,7 +604,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -626,7 +626,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -642,7 +642,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -664,7 +664,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -679,7 +679,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -703,6 +703,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2019win81/PluginBridge.vcxproj.filters
===================================================================
--- build/vs2019win81/PluginBridge.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/PluginBridge.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2019win81/PluginBridgeLegacy.vcxproj
===================================================================
--- build/vs2019win81/PluginBridgeLegacy.vcxproj	(revision 14628)
+++ build/vs2019win81/PluginBridgeLegacy.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -286,7 +286,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -307,7 +307,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -318,7 +318,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -340,7 +340,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -356,7 +356,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -378,7 +378,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -393,7 +393,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -416,7 +416,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -432,7 +432,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -454,7 +454,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -469,7 +469,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -492,7 +492,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -503,7 +503,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -523,7 +523,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -534,7 +534,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -555,7 +555,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -571,7 +571,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -593,7 +593,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -608,7 +608,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -631,7 +631,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -647,7 +647,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"x86\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -669,7 +669,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -684,7 +684,7 @@
     </ClCompile>
     <ResourceCompile>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;VER_ARCHNAME=\"amd64\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ResourceCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -709,6 +709,108 @@
     <ClInclude Include="..\..\pluginBridge\Bridge.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeCommon.h" />
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp" />
Index: build/vs2019win81/PluginBridgeLegacy.vcxproj.filters
===================================================================
--- build/vs2019win81/PluginBridgeLegacy.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/PluginBridgeLegacy.vcxproj.filters	(working copy)
@@ -10,6 +10,96 @@
     <Filter Include="pluginBridge">
       <UniqueIdentifier>{E1FAE259-CD5D-72FE-76E3-AAB462253E81}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\versionNumber.h">
@@ -30,6 +120,312 @@
     <ClInclude Include="..\..\pluginBridge\BridgeOpCodes.h">
       <Filter>pluginBridge</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\pluginBridge\Bridge.cpp">
Index: build/vs2019win81/signtool.vcxproj
===================================================================
--- build/vs2019win81/signtool.vcxproj	(revision 14628)
+++ build/vs2019win81/signtool.vcxproj	(working copy)
@@ -275,7 +275,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -299,7 +299,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -323,7 +323,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -353,7 +353,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -382,7 +382,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -412,7 +412,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_STATIC;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -441,7 +441,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -464,7 +464,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
       <MinimalRebuild>false</MinimalRebuild>
@@ -487,7 +487,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -517,7 +517,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>NDEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -546,7 +546,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -576,7 +576,7 @@
       <PrecompiledHeader>NotUsing</PrecompiledHeader>
       <WarningLevel>Level4</WarningLevel>
       <PreprocessorDefinitions>DEBUG;MPT_BUILD_MSVC_SHARED;MPT_BUILD_CHECKED;MPT_BUILD_MSVC;WIN32;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1;_WIN32_WINNT=0x0603;MODPLUG_TRACKER;MPT_BUILD_SIGNTOOL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\..\src;..\..\common;..\..\include;..\..\include\nlohmann-json\include;$(IntDir)\svn_version;..\svn_version;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Full</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -648,6 +648,108 @@
     <ClInclude Include="..\..\misc\mptCrypto.h" />
     <ClInclude Include="..\..\misc\mptUUIDNamespace.h" />
     <ClInclude Include="..\..\misc\mptWine.h" />
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\array.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\span.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\version.hpp" />
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp" />
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp" />
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp" />
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp" />
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp" />
+    <ClInclude Include="..\..\src\mpt\json\json.hpp" />
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp" />
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp" />
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\device.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\random.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp" />
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\types.hpp" />
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp" />
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test.hpp" />
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp" />
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp" />
@@ -672,8 +774,6 @@
     <ClCompile Include="..\..\installer\signtool\signtool.cpp" />
     <ClCompile Include="..\..\misc\mptCPU.cpp" />
     <ClCompile Include="..\..\misc\mptColor.cpp" />
-    <ClCompile Include="..\..\misc\mptCrypto.cpp" />
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp" />
     <ClCompile Include="..\..\misc\mptWine.cpp" />
   </ItemGroup>
   <ItemGroup>
Index: build/vs2019win81/signtool.vcxproj.filters
===================================================================
--- build/vs2019win81/signtool.vcxproj.filters	(revision 14628)
+++ build/vs2019win81/signtool.vcxproj.filters	(working copy)
@@ -13,6 +13,96 @@
     <Filter Include="misc">
       <UniqueIdentifier>{B1A29A7C-9DD9-9B0D-46C6-811032DC170F}</UniqueIdentifier>
     </Filter>
+    <Filter Include="src">
+      <UniqueIdentifier>{2DAB880B-99B4-887C-2230-9F7C8E38947C}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt">
+      <UniqueIdentifier>{0D1E30A9-79FD-AE44-8215-3A1BEE7315A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base">
+      <UniqueIdentifier>{D7D6CF03-C339-5FA8-6CBF-975E58012B2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\base\tests">
+      <UniqueIdentifier>{F94610AE-E52A-D103-4E8B-CB563A8EBB85}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary">
+      <UniqueIdentifier>{E1ECAE37-CDBA-A23D-B64E-1364A2BB7EA2}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\binary\tests">
+      <UniqueIdentifier>{833C2E90-6FCB-B759-18EA-CB540458C8FF}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\check">
+      <UniqueIdentifier>{7A65E07D-E625-5CB4-AF60-A5311BE0A090}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc">
+      <UniqueIdentifier>{94D615E1-008C-8ED6-8980-88ADF53485DA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crc\tests">
+      <UniqueIdentifier>{766058C2-E276-5658-2BEE-E179974327E0}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto">
+      <UniqueIdentifier>{3D3AAD3A-2908-A140-129C-1167FE087DA5}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\crypto\tests">
+      <UniqueIdentifier>{DF1EE047-CBAD-6911-74CC-7D0C603A7AB7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\detect">
+      <UniqueIdentifier>{7535143C-6103-0842-4A97-78683604E4A6}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian">
+      <UniqueIdentifier>{4B85033F-3753-F744-20E7-676B0C54D3A9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\endian\tests">
+      <UniqueIdentifier>{6DFC313A-598B-BB03-02AA-CFFEEE17CCA9}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\environment">
+      <UniqueIdentifier>{B1B8A85D-1D1A-866B-A687-CC1D12E8BC2A}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\exception_text">
+      <UniqueIdentifier>{6F821773-5B7C-40C5-44E9-D6D53082A631}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\json">
+      <UniqueIdentifier>{F685D403-E2E8-63A8-8B6E-9C5E77B02F2B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\mutex">
+      <UniqueIdentifier>{8FBB9C7E-FB7B-18B5-C4B6-613230365D91}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\osinfo">
+      <UniqueIdentifier>{EA69B456-D637-A85C-BFCB-1883AB3884C1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\out_of_memory">
+      <UniqueIdentifier>{208F8479-8CFB-3F74-55EF-D7D1C11A62DC}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random">
+      <UniqueIdentifier>{3DBF705C-298D-6462-1221-D588FE8D40C7}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\random\tests">
+      <UniqueIdentifier>{DF637371-CBF2-FC3A-7411-1136607F0DE1}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string">
+      <UniqueIdentifier>{13002060-FFCD-1366-E861-848CD4CEEFCA}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\string\tests">
+      <UniqueIdentifier>{356DC124-21FC-4AEE-CA1A-5FE9B6885B94}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\system_error">
+      <UniqueIdentifier>{EA9E70B3-D62D-FA7C-7F4C-0E786BBA0A23}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\test">
+      <UniqueIdentifier>{BCC6D903-A829-69A8-51AF-A15E3DF1342B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid">
+      <UniqueIdentifier>{D395DA03-BFF8-69A8-687E-A25E54C0352B}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid\tests">
+      <UniqueIdentifier>{F552058D-E136-C6E2-4A97-C035369AB064}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace">
+      <UniqueIdentifier>{5F481DCA-4B42-461C-34AF-DC2C2048AC88}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="src\mpt\uuid_namespace\tests">
+      <UniqueIdentifier>{81BEDE93-6D79-CE3F-1631-478A02CB18D0}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\common\BuildSettings.h">
@@ -156,6 +246,312 @@
     <ClInclude Include="..\..\misc\mptWine.h">
       <Filter>misc</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\algorithm.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\alloc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\arithmetic_shift.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\array.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\bit.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\check_platform.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\compiletime_warning.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\constexpr_throw.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_compiler.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libc.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_libcxx.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_os.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\detect_quirks.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\floatingpoint.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\integer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\macros.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\math.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\memory.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\namespace.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\numeric.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\pointer.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\preprocessor.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_cast.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\saturate_round.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\secure.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\semantic_version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\source_location.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\span.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_arithmetic_shift.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_bit.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_math.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_cast.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_saturate_round.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\tests\tests_base_wrapping_divide.hpp">
+      <Filter>src\mpt\base\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\utility.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\version.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\base\wrapping_divide.hpp">
+      <Filter>src\mpt\base</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\base64url.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\hex.hpp">
+      <Filter>src\mpt\binary</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\binary\tests\tests_binary.hpp">
+      <Filter>src\mpt\binary\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\libc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\mfc.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\check\windows.hpp">
+      <Filter>src\mpt\check</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\crc.hpp">
+      <Filter>src\mpt\crc</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crc\tests\tests_crc.hpp">
+      <Filter>src\mpt\crc\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\exception.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\hash.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\jwk.hpp">
+      <Filter>src\mpt\crypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\crypto\tests\tests_crypto.hpp">
+      <Filter>src\mpt\crypto\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\mfc.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\detect\nlohmann_json.hpp">
+      <Filter>src\mpt\detect</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\floatingpoint.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\integer.hpp">
+      <Filter>src\mpt\endian</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_floatingpoint.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\endian\tests\tests_endian_integer.hpp">
+      <Filter>src\mpt\endian\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\environment\environment.hpp">
+      <Filter>src\mpt\environment</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\exception_text\exception_text.hpp">
+      <Filter>src\mpt\exception_text</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\json\json.hpp">
+      <Filter>src\mpt\json</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\mutex\mutex.hpp">
+      <Filter>src\mpt\mutex</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\osinfo\windows_version.hpp">
+      <Filter>src\mpt\osinfo</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\out_of_memory\out_of_memory.hpp">
+      <Filter>src\mpt\out_of_memory</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\crand.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\default_engines.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\device.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\engine_lcg.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\random.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\seed.hpp">
+      <Filter>src\mpt\random</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\random\tests\tests_random.hpp">
+      <Filter>src\mpt\random\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\buffer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\convert_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_formatter.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_default_string.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_helpers.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_message_macros.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_floatingpoint.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_integer.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\format_simple_spec.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\parse.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_buffer.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_convert.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_message.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_format_simple.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_parse.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\tests\tests_string_utility.hpp">
+      <Filter>src\mpt\string\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\types.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\string\utility.hpp">
+      <Filter>src\mpt\string</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\system_error\system_error.hpp">
+      <Filter>src\mpt\system_error</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\test\test_macros.hpp">
+      <Filter>src\mpt\test</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\guid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\tests\tests_uuid.hpp">
+      <Filter>src\mpt\uuid\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid\uuid.hpp">
+      <Filter>src\mpt\uuid</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\tests\tests_uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace\tests</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\src\mpt\uuid_namespace\uuid_namespace.hpp">
+      <Filter>src\mpt\uuid_namespace</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\common\ComponentManager.cpp">
@@ -224,12 +620,6 @@
     <ClCompile Include="..\..\misc\mptColor.cpp">
       <Filter>misc</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\misc\mptCrypto.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\misc\mptUUIDNamespace.cpp">
-      <Filter>misc</Filter>
-    </ClCompile>
     <ClCompile Include="..\..\misc\mptWine.cpp">
       <Filter>misc</Filter>
     </ClCompile>
Index: build/wine/build_wine_support.cmd
===================================================================
--- build/wine/build_wine_support.cmd	(revision 14628)
+++ build/wine/build_wine_support.cmd	(working copy)
@@ -25,6 +25,34 @@
  include\nlohmann-json\include\nlohmann\thirdparty\hedley\*.hpp ^
  include\rtkit\rtkit.c ^
  include\rtkit\rtkit.h ^
+ src\mpt\base\*.hpp ^
+ src\mpt\base\tests\*.hpp ^
+ src\mpt\binary\*.hpp ^
+ src\mpt\binary\tests\*.hpp ^
+ src\mpt\check\*.hpp ^
+ src\mpt\crc\*.hpp ^
+ src\mpt\crc\tests\*.hpp ^
+ src\mpt\crypto\*.hpp ^
+ src\mpt\crypto\tests\*.hpp ^
+ src\mpt\detect\*.hpp ^
+ src\mpt\endian\*.hpp ^
+ src\mpt\endian\tests\*.hpp ^
+ src\mpt\environment\*.hpp ^
+ src\mpt\exception_text\*.hpp ^
+ src\mpt\json\*.hpp ^
+ src\mpt\mutex\*.hpp ^
+ src\mpt\osinfo\*.hpp ^
+ src\mpt\out_of_memory\*.hpp ^
+ src\mpt\random\*.hpp ^
+ src\mpt\random\tests\*.hpp ^
+ src\mpt\string\*.hpp ^
+ src\mpt\string\tests\*.hpp ^
+ src\mpt\system_error\*.hpp ^
+ src\mpt\test\*.hpp ^
+ src\mpt\uuid\*.hpp ^
+ src\mpt\uuid\test\*.hpp ^
+ src\mpt\uuid_namespace\*.hpp ^
+ src\mpt\uuid_namespace\tests\*.hpp ^
  common\*.h ^
  common\*.cpp ^
  soundbase\*.h ^
Index: build/xcode-genie/mpt-libopenmpt.lua
===================================================================
--- build/xcode-genie/mpt-libopenmpt.lua	(revision 14628)
+++ build/xcode-genie/mpt-libopenmpt.lua	(working copy)
@@ -18,6 +18,7 @@
   includedirs ( extincludedirs )
   includedirs {
    "../..",
+   "../../src",
    "../../common",
    "../../soundlib",
    "$(IntDir)/svn_version",
@@ -24,6 +25,8 @@
    "../../build/svn_version",
   }
   files {
+   "../../src/mpt/**.cpp",
+   "../../src/mpt/**.hpp",
    "../../common/*.cpp",
    "../../common/*.h",
    "../../soundbase/*.cpp",
@@ -53,6 +56,16 @@
    "../../libopenmpt/libopenmpt_ext_impl.cpp",
    "../../libopenmpt/libopenmpt_impl.cpp",
   }
+	excludes {
+		"../../src/mpt/crypto/**.cpp",
+		"../../src/mpt/crypto/**.hpp",
+		"../../src/mpt/json/**.cpp",
+		"../../src/mpt/json/**.hpp",
+		"../../src/mpt/test/**.cpp",
+		"../../src/mpt/test/**.hpp",
+		"../../src/mpt/uuid_namespace/**.cpp",
+		"../../src/mpt/uuid_namespace/**.hpp",
+	}
 	configuration {}
 
   defines { "LIBOPENMPT_BUILD" }
Index: build/xcode9-iphoneos/ext/vorbis.xcodeproj/project.pbxproj
===================================================================
--- build/xcode9-iphoneos/ext/vorbis.xcodeproj/project.pbxproj	(revision 14628)
+++ build/xcode9-iphoneos/ext/vorbis.xcodeproj/project.pbxproj	(working copy)
@@ -195,7 +195,7 @@
 				B52E177AA13EC34A0AF82769 /* vorbis */,
 			);
 			name = "include";
-			path = "../../include";
+			path = "../../../include";
 			sourceTree = "<group>";
 		};
 		B52E177AA13EC34A0AF82769 /* vorbis */ = {
Index: build/xcode9-iphoneos/libopenmpt.xcodeproj/project.pbxproj
===================================================================
--- build/xcode9-iphoneos/libopenmpt.xcodeproj/project.pbxproj	(revision 14628)
+++ build/xcode9-iphoneos/libopenmpt.xcodeproj/project.pbxproj	(working copy)
@@ -277,6 +277,108 @@
 		7F669750EB773FF774C9D136 /* tuningCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6E6ED48B5AEC242543E4E2BC /* tuningCollection.cpp */; };
 		35D73C77A13CD0FD2A1572D6 /* tuningbase.h in Headers */ = {isa = PBXBuildFile; fileRef = 64866C7650D8436639F78076 /* tuningbase.h */; };
 		FF0E654E6BD5C16AB43050CD /* tuningcollection.h in Headers */ = {isa = PBXBuildFile; fileRef = D7109B26C3239B7F6C0D786C /* tuningcollection.h */; };
+		9C15752988BEDC58B154F8D7 /* algorithm.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CB5F32E137C5C567C09D6740 /* algorithm.hpp */; };
+		427834F72E8B3450D774113D /* alloc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 31ABD04C9D3A9237A636734F /* alloc.hpp */; };
+		00AE5F976C954A8D75834C09 /* arithmetic_shift.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CFA8EC5CBB3CE20424013CB9 /* arithmetic_shift.hpp */; };
+		B16C5A989D7F5AF1466937DE /* array.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 405E9187ACED5272B5E9338A /* array.hpp */; };
+		93D2D2157F3A99E3E8A5ADF9 /* bit.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 224BB17F8E0FB06F5775E039 /* bit.hpp */; };
+		78ED28CCE4091BBDADE1872A /* check_platform.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 87716DE6731AD5159CB0F094 /* check_platform.hpp */; };
+		25C236D01182C7747A9FAF7F /* compiletime_warning.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 74155F7CE031516DA909BEDA /* compiletime_warning.hpp */; };
+		53CD658F3F779B9E2848A3B9 /* constexpr_throw.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6234A41DCEFA003A17568F9C /* constexpr_throw.hpp */; };
+		CC485B3F38B95DB801D8D740 /* detect.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 5B1990F3479683367013844A /* detect.hpp */; };
+		48990F11344345201D144D3B /* detect_compiler.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 37739C93A339F9AFEC948712 /* detect_compiler.hpp */; };
+		C9FB6C23B58F62CB1E54BC7F /* detect_libc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 980934EB047A3664CD98B0EC /* detect_libc.hpp */; };
+		FB84DB9FE7C3851B9046624D /* detect_libcxx.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 4A0FB859B64A181DBF3F95AC /* detect_libcxx.hpp */; };
+		B52B88A6A1D4EFD5CA6A0B55 /* detect_os.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 4402303AB067C3C039406599 /* detect_os.hpp */; };
+		8B553D277794E7A22017C4D4 /* detect_quirks.hpp in Headers */ = {isa = PBXBuildFile; fileRef = DA450125468161E84F76DE77 /* detect_quirks.hpp */; };
+		F4C3A4BDE0024F3989852B6B /* floatingpoint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A3CED61B0F0A37DF18FFB36E /* floatingpoint.hpp */; };
+		66C8DD7952462E133B3EECAA /* integer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 950801B4012364554A4574E9 /* integer.hpp */; };
+		1FAD27708B1D2AE9543CA471 /* macros.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CEBD9467BA3A88AAE3B788BE /* macros.hpp */; };
+		46A92A05B20EBE8B3BE75F64 /* math.hpp in Headers */ = {isa = PBXBuildFile; fileRef = D58929FFC1DB00EFAAFA3DFF /* math.hpp */; };
+		4EF4AFC3BA64B23C83832CC5 /* memory.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 9D0B894289887C85B2057D99 /* memory.hpp */; };
+		6421CBB750CA32E779604E66 /* namespace.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 93EE5781FF53EB07882C8DE0 /* namespace.hpp */; };
+		ACBE43CB983C9464813452FC /* numeric.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 1B7BDC3F87953FE1D0B74F75 /* numeric.hpp */; };
+		5CB3ABFD4831FC963129BA2E /* pointer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CBC19C5637DCFFF780FE0F8C /* pointer.hpp */; };
+		6423BD90D03465375986F776 /* preprocessor.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3348E2A01FC6323A08BEF0D1 /* preprocessor.hpp */; };
+		A03B3F6F8C7AE9EA35FDC51C /* saturate_cast.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CFCA30133B0691D644FB0D66 /* saturate_cast.hpp */; };
+		5F15AC7BCB319E6C94090BDA /* saturate_round.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 0E4DA715FAF50E45238C2AC4 /* saturate_round.hpp */; };
+		D8261E60449720D90DB69A61 /* secure.hpp in Headers */ = {isa = PBXBuildFile; fileRef = E7FF40BDD37C3400FCF93414 /* secure.hpp */; };
+		ECAC758D58946083618262FF /* semantic_version.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3BA460B82738566090FCAF14 /* semantic_version.hpp */; };
+		FE273083EAD16592D3A26DAD /* source_location.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 2D78A5C5993E02E2E2999044 /* source_location.hpp */; };
+		801F8C8CEC841F13755DC1EB /* span.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CFB31F52BB05F741A4243452 /* span.hpp */; };
+		C68BD202B2B81E34DB99C144 /* tests_base_arithmetic_shift.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B5A0EB57210A81BAAA4D2F65 /* tests_base_arithmetic_shift.hpp */; };
+		40FBF82DACB8A16435838DCC /* tests_base_bit.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 8F55448E7BFF799D64D081B8 /* tests_base_bit.hpp */; };
+		CD858060B9F0406C620CA6D1 /* tests_base_math.hpp in Headers */ = {isa = PBXBuildFile; fileRef = DC33C46D481BAF635109B1DF /* tests_base_math.hpp */; };
+		0FF84D797B6CE3D644B630E6 /* tests_base_saturate_cast.hpp in Headers */ = {isa = PBXBuildFile; fileRef = E793E1BDD3947538FC5CE2BC /* tests_base_saturate_cast.hpp */; };
+		EE5B202ADA5D643AC3E05A33 /* tests_base_saturate_round.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 1DD48AA189F29E6ED2BFA480 /* tests_base_saturate_round.hpp */; };
+		DCEE6CA4482E31BD510EF8D4 /* tests_base_wrapping_divide.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 2B0E58AC17FAEF1B8070AF6E /* tests_base_wrapping_divide.hpp */; };
+		C893DB60B4112CFA9D09EA91 /* utility.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B7AE97A523C9FA466CEB0ADB /* utility.hpp */; };
+		1C988F0B0816E0A4F10D9E3C /* version.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 8BAE8EC4F7C8F16540EB01FA /* version.hpp */; };
+		8BC8C5817772FB90604303AC /* wrapping_divide.hpp in Headers */ = {isa = PBXBuildFile; fileRef = E3933AE14F5A97FD98B52560 /* wrapping_divide.hpp */; };
+		C16138A92D9D986C369215FC /* base64.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F0B09491DC185B5F45846F75 /* base64.hpp */; };
+		F607C2D9E29BB7814B601136 /* base64url.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A58508BF11F60A38DA1485C0 /* base64url.hpp */; };
+		053796FEF14996579A337344 /* hex.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 14649C3680F35D2189EF3E39 /* hex.hpp */; };
+		3334DC8F9FF184C628BC702E /* tests_binary.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 8BA7F3577751296760223182 /* tests_binary.hpp */; };
+		502439753C3739CEE52016BB /* libc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 7F168852EBA5493DF4A12A55 /* libc.hpp */; };
+		AE01B73F1A674AC6A33FEC9E /* mfc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D019BE2295372D21272AFE2 /* mfc.hpp */; };
+		05EF2002712A81C57A1FFE54 /* windows.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B4E39A4BA04B611909B7752F /* windows.hpp */; };
+		26CB79B992E5DC5ADB07EDEE /* crc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 9E7035588A57F74F33A85D6D /* crc.hpp */; };
+		BDA9C31829C6B509F29D2277 /* tests_crc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = AC2E9BF998D70229C16D1EA8 /* tests_crc.hpp */; };
+		0CDBF337F86EE9DF61334394 /* exception.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FB92CED56703D14E30224BD7 /* exception.hpp */; };
+		A349BCCE0FBABE47D8D838D0 /* hash.hpp in Headers */ = {isa = PBXBuildFile; fileRef = D277709CBEF463DFE77164F3 /* hash.hpp */; };
+		44CEA27030E1A2C9D9CA7FB6 /* jwk.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FC9FF0F0682FB2DB712B93F3 /* jwk.hpp */; };
+		D01B0A173CD9B24DC5A39EB5 /* tests_crypto.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 1FDC6ACC0B86A0DBF456A8F6 /* tests_crypto.hpp */; };
+		0C2970FCF83B7055A1254D42 /* mfc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BB351E1027C5DFFA30C1C012 /* mfc.hpp */; };
+		0CA818CFF8514EDEE12256F9 /* nlohmann_json.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 7B378CD2E7FDE8EE30597751 /* nlohmann_json.hpp */; };
+		0642A890F2EBDD9FDBBCE5BA /* floatingpoint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 352D9BC9A1F3F7E5EA4E8648 /* floatingpoint.hpp */; };
+		78A96A1D6452D24C8DE8EDCB /* integer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 271A49A1937FDC271C587E00 /* integer.hpp */; };
+		8DCD11FCF997E356429EE27B /* tests_endian_floatingpoint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FC15C013E8AC02C9916179C9 /* tests_endian_floatingpoint.hpp */; };
+		7F682B86EBD1C0E874156F93 /* tests_endian_integer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6E4E7DA05A24049E43CE1EF1 /* tests_endian_integer.hpp */; };
+		44564418B0C88634F95CBCB8 /* environment.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 53F2C88C3F317308E8B34F3A /* environment.hpp */; };
+		A308F4920F9C55411883C5F7 /* exception_text.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 922031457EE0C1E9E7FDA9F4 /* exception_text.hpp */; };
+		F48988AC60EF1B33E9C7BD0B /* json.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C3C5DEE1AF17B6D19836F3E1 /* json.hpp */; };
+		20779C208CE79E9955061922 /* mutex.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 58ECD0E74469C42A6DE6C43E /* mutex.hpp */; };
+		DBD126C7C7A66E7AF055AE76 /* windows_version.hpp in Headers */ = {isa = PBXBuildFile; fileRef = AAA7D04116B978E89F0A0B28 /* windows_version.hpp */; };
+		C8512EC7341AFC4AFDAA045D /* out_of_memory.hpp in Headers */ = {isa = PBXBuildFile; fileRef = D7323E80C3078633ECB6C52F /* out_of_memory.hpp */; };
+		CCC7EE3DB8453FD7A13DFD6E /* crand.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3B50156AA76A780BF08C889F /* crand.hpp */; };
+		61FBC86C4DD01020767F501C /* default_engines.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 70456B4FDC5613F665A8A535 /* default_engines.hpp */; };
+		6620FFC0D25B5F84DB50DC13 /* device.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 75746B7F61DC314DCA474663 /* device.hpp */; };
+		0E4DC99C7A882960837DA6EF /* engine.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 1D18D55009809B1E72EBAF34 /* engine.hpp */; };
+		2537EAAE914892551A9A2495 /* engine_lcg.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 54BF328A403D8323293541BB /* engine_lcg.hpp */; };
+		7D225C3FE95DBC02F2523992 /* random.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 2C0C322C1874F8F981DF0C10 /* random.hpp */; };
+		369B037BA20B06F46B2A807C /* seed.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 85C1D6EE713ECA319ABBCA45 /* seed.hpp */; };
+		8D74999BF93142D282FC2D3A /* tests_random.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BC8A232EA834593D91056158 /* tests_random.hpp */; };
+		8B8918C8F7C4788B00BAF51A /* buffer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 7A52207166BAE63ECF25FB54 /* buffer.hpp */; };
+		7462DF90600B47C089A1623F /* convert.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A3456BE00FABFE669883A03F /* convert.hpp */; };
+		B1AAAFF21D929AE826809C64 /* convert_macros.hpp in Headers */ = {isa = PBXBuildFile; fileRef = E0B2BE69CC46B411350B0EC6 /* convert_macros.hpp */; };
+		F8158C97648A21F52DD46E04 /* format_default_floatingpoint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 07E8B2CAF3E846451CB1B3C9 /* format_default_floatingpoint.hpp */; };
+		303D13D59C5B27A2E5282DB4 /* format_default_formatter.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BFA4F3FEAB0FB40A542B1970 /* format_default_formatter.hpp */; };
+		ECF70A4B588B6CF96172DCAF /* format_default_integer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3B1EEA7627DE7A1B90FB6226 /* format_default_integer.hpp */; };
+		37F72B8523CDB2820C77CDD5 /* format_default_string.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C6CED4E1324117FE7BD54C82 /* format_default_string.hpp */; };
+		E82E641554164F0B5D045187 /* format_helpers.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B7F87AEDA38C70950C51CA49 /* format_helpers.hpp */; };
+		9CDDD46D08C5BF6311B3C1DF /* format_message.hpp in Headers */ = {isa = PBXBuildFile; fileRef = EBA6A29AD73A984240FFF1F6 /* format_message.hpp */; };
+		A284A6AB8E5A2DA9770448FC /* format_message_macros.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 518D2BEABDFF6D060694A38A /* format_message_macros.hpp */; };
+		05D20B18F17B4127DA4C4942 /* format_simple.hpp in Headers */ = {isa = PBXBuildFile; fileRef = D401362840C89244892321A7 /* format_simple.hpp */; };
+		04F53466F08B771B9940EE1B /* format_simple_floatingpoint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B3F311931F877341286EE3F7 /* format_simple_floatingpoint.hpp */; };
+		8D1BB4B179F13AAF629B5502 /* format_simple_integer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 5C6529F6C8D76B12116CA196 /* format_simple_integer.hpp */; };
+		ECE7C27158A56BA8E16F5710 /* format_simple_spec.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BBA6103AA750464990214E64 /* format_simple_spec.hpp */; };
+		0D4173F5F9BEC38EE2B68126 /* parse.hpp in Headers */ = {isa = PBXBuildFile; fileRef = DCBCA73148D70AD391F91A67 /* parse.hpp */; };
+		F94966FBE535FE6A4EACBDBD /* tests_string_buffer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C8173AC334E00747FD701059 /* tests_string_buffer.hpp */; };
+		D98D77C845F70C2BCE3ABBD5 /* tests_string_convert.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 7149BE485D1F454646C95F99 /* tests_string_convert.hpp */; };
+		A710B1889328BC3DFCF79B02 /* tests_string_format_message.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B628FCAC229D910AEBE6DE19 /* tests_string_format_message.hpp */; };
+		6E026A3EDACC3B9923D33ABE /* tests_string_format_simple.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D7A5A4A29119DFFD2C51300 /* tests_string_format_simple.hpp */; };
+		19412077855F3444CE2C3A56 /* tests_string_parse.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 0853BBE0F4BD7BEC9DD9E051 /* tests_string_parse.hpp */; };
+		54AA52BDC013E81F495796CA /* tests_string_utility.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 23D7596A0FADE067F856FBBA /* tests_string_utility.hpp */; };
+		A4CEE429904C35C37944F35A /* types.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 5CBE19A3C8D87C4411FB8CD8 /* types.hpp */; };
+		05A29141F14AF9701AE114F0 /* utility.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 9446926E00AC25F58984C7CD /* utility.hpp */; };
+		7984746AE5411DA16E0C0909 /* system_error.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 28F7ADCD14A1E3DCFD71EBF7 /* system_error.hpp */; };
+		400A3967AC6FCCED35486EC6 /* test.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 8FE69E037B3876F36457B303 /* test.hpp */; };
+		5DCDC2754961B81DB22512D2 /* test_macros.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 7599632DE10966A6AA28E02E /* test_macros.hpp */; };
+		1C17C7FA887C5A811155FC59 /* guid.hpp in Headers */ = {isa = PBXBuildFile; fileRef = EB79DE7AD7CBB56AC0EAF27A /* guid.hpp */; };
+		419F30FFAD861BF5B6741D71 /* tests_uuid.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 708D205D5C211605C5E56FB9 /* tests_uuid.hpp */; };
+		0F0849387B6DDCBE04467E97 /* uuid.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FE462636EA98FD25D3B73A36 /* uuid.hpp */; };
+		9699775002AFE5A68B6BBF07 /* tests_uuid_namespace.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 254477ED1146BBFDFAC8B1F6 /* tests_uuid_namespace.hpp */; };
+		E4C023615054850F593BF5C5 /* uuid_namespace.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 336CABEC1F2C3C918849249C /* uuid_namespace.hpp */; };
 		ED7E69FCD9ACD6EFC20872B5 /* libopenmpt-mpg123.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FC4593106810656BB1166490 /* libopenmpt-mpg123.dylib */; };
 		A3ACC5948FDA32887836CE4D /* libopenmpt-vorbis.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F28958BE5E542A19A75A293E /* libopenmpt-vorbis.dylib */; };
 		138E8CDBFFBAD80C289C7B1D /* libopenmpt-ogg.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C2B9A5172E233B7AB766E924 /* libopenmpt-ogg.dylib */; };
@@ -598,6 +700,108 @@
 		6E6ED48B5AEC242543E4E2BC /* tuningCollection.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "tuningCollection.cpp"; path = "tuningCollection.cpp"; sourceTree = "<group>"; };
 		64866C7650D8436639F78076 /* tuningbase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "tuningbase.h"; path = "tuningbase.h"; sourceTree = "<group>"; };
 		D7109B26C3239B7F6C0D786C /* tuningcollection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "tuningcollection.h"; path = "tuningcollection.h"; sourceTree = "<group>"; };
+		CB5F32E137C5C567C09D6740 /* algorithm.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "algorithm.hpp"; path = "algorithm.hpp"; sourceTree = "<group>"; };
+		31ABD04C9D3A9237A636734F /* alloc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "alloc.hpp"; path = "alloc.hpp"; sourceTree = "<group>"; };
+		CFA8EC5CBB3CE20424013CB9 /* arithmetic_shift.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "arithmetic_shift.hpp"; path = "arithmetic_shift.hpp"; sourceTree = "<group>"; };
+		405E9187ACED5272B5E9338A /* array.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "array.hpp"; path = "array.hpp"; sourceTree = "<group>"; };
+		224BB17F8E0FB06F5775E039 /* bit.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "bit.hpp"; path = "bit.hpp"; sourceTree = "<group>"; };
+		87716DE6731AD5159CB0F094 /* check_platform.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "check_platform.hpp"; path = "check_platform.hpp"; sourceTree = "<group>"; };
+		74155F7CE031516DA909BEDA /* compiletime_warning.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "compiletime_warning.hpp"; path = "compiletime_warning.hpp"; sourceTree = "<group>"; };
+		6234A41DCEFA003A17568F9C /* constexpr_throw.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "constexpr_throw.hpp"; path = "constexpr_throw.hpp"; sourceTree = "<group>"; };
+		5B1990F3479683367013844A /* detect.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect.hpp"; path = "detect.hpp"; sourceTree = "<group>"; };
+		37739C93A339F9AFEC948712 /* detect_compiler.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect_compiler.hpp"; path = "detect_compiler.hpp"; sourceTree = "<group>"; };
+		980934EB047A3664CD98B0EC /* detect_libc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect_libc.hpp"; path = "detect_libc.hpp"; sourceTree = "<group>"; };
+		4A0FB859B64A181DBF3F95AC /* detect_libcxx.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect_libcxx.hpp"; path = "detect_libcxx.hpp"; sourceTree = "<group>"; };
+		4402303AB067C3C039406599 /* detect_os.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect_os.hpp"; path = "detect_os.hpp"; sourceTree = "<group>"; };
+		DA450125468161E84F76DE77 /* detect_quirks.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect_quirks.hpp"; path = "detect_quirks.hpp"; sourceTree = "<group>"; };
+		A3CED61B0F0A37DF18FFB36E /* floatingpoint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "floatingpoint.hpp"; path = "floatingpoint.hpp"; sourceTree = "<group>"; };
+		950801B4012364554A4574E9 /* integer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "integer.hpp"; path = "integer.hpp"; sourceTree = "<group>"; };
+		CEBD9467BA3A88AAE3B788BE /* macros.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "macros.hpp"; path = "macros.hpp"; sourceTree = "<group>"; };
+		D58929FFC1DB00EFAAFA3DFF /* math.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "math.hpp"; path = "math.hpp"; sourceTree = "<group>"; };
+		9D0B894289887C85B2057D99 /* memory.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "memory.hpp"; path = "memory.hpp"; sourceTree = "<group>"; };
+		93EE5781FF53EB07882C8DE0 /* namespace.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "namespace.hpp"; path = "namespace.hpp"; sourceTree = "<group>"; };
+		1B7BDC3F87953FE1D0B74F75 /* numeric.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "numeric.hpp"; path = "numeric.hpp"; sourceTree = "<group>"; };
+		CBC19C5637DCFFF780FE0F8C /* pointer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "pointer.hpp"; path = "pointer.hpp"; sourceTree = "<group>"; };
+		3348E2A01FC6323A08BEF0D1 /* preprocessor.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "preprocessor.hpp"; path = "preprocessor.hpp"; sourceTree = "<group>"; };
+		CFCA30133B0691D644FB0D66 /* saturate_cast.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "saturate_cast.hpp"; path = "saturate_cast.hpp"; sourceTree = "<group>"; };
+		0E4DA715FAF50E45238C2AC4 /* saturate_round.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "saturate_round.hpp"; path = "saturate_round.hpp"; sourceTree = "<group>"; };
+		E7FF40BDD37C3400FCF93414 /* secure.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "secure.hpp"; path = "secure.hpp"; sourceTree = "<group>"; };
+		3BA460B82738566090FCAF14 /* semantic_version.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "semantic_version.hpp"; path = "semantic_version.hpp"; sourceTree = "<group>"; };
+		2D78A5C5993E02E2E2999044 /* source_location.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "source_location.hpp"; path = "source_location.hpp"; sourceTree = "<group>"; };
+		CFB31F52BB05F741A4243452 /* span.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "span.hpp"; path = "span.hpp"; sourceTree = "<group>"; };
+		B5A0EB57210A81BAAA4D2F65 /* tests_base_arithmetic_shift.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_arithmetic_shift.hpp"; path = "tests_base_arithmetic_shift.hpp"; sourceTree = "<group>"; };
+		8F55448E7BFF799D64D081B8 /* tests_base_bit.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_bit.hpp"; path = "tests_base_bit.hpp"; sourceTree = "<group>"; };
+		DC33C46D481BAF635109B1DF /* tests_base_math.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_math.hpp"; path = "tests_base_math.hpp"; sourceTree = "<group>"; };
+		E793E1BDD3947538FC5CE2BC /* tests_base_saturate_cast.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_saturate_cast.hpp"; path = "tests_base_saturate_cast.hpp"; sourceTree = "<group>"; };
+		1DD48AA189F29E6ED2BFA480 /* tests_base_saturate_round.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_saturate_round.hpp"; path = "tests_base_saturate_round.hpp"; sourceTree = "<group>"; };
+		2B0E58AC17FAEF1B8070AF6E /* tests_base_wrapping_divide.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_wrapping_divide.hpp"; path = "tests_base_wrapping_divide.hpp"; sourceTree = "<group>"; };
+		B7AE97A523C9FA466CEB0ADB /* utility.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "utility.hpp"; path = "utility.hpp"; sourceTree = "<group>"; };
+		8BAE8EC4F7C8F16540EB01FA /* version.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "version.hpp"; path = "version.hpp"; sourceTree = "<group>"; };
+		E3933AE14F5A97FD98B52560 /* wrapping_divide.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "wrapping_divide.hpp"; path = "wrapping_divide.hpp"; sourceTree = "<group>"; };
+		F0B09491DC185B5F45846F75 /* base64.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "base64.hpp"; path = "base64.hpp"; sourceTree = "<group>"; };
+		A58508BF11F60A38DA1485C0 /* base64url.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "base64url.hpp"; path = "base64url.hpp"; sourceTree = "<group>"; };
+		14649C3680F35D2189EF3E39 /* hex.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "hex.hpp"; path = "hex.hpp"; sourceTree = "<group>"; };
+		8BA7F3577751296760223182 /* tests_binary.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_binary.hpp"; path = "tests_binary.hpp"; sourceTree = "<group>"; };
+		7F168852EBA5493DF4A12A55 /* libc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "libc.hpp"; path = "libc.hpp"; sourceTree = "<group>"; };
+		3D019BE2295372D21272AFE2 /* mfc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "mfc.hpp"; path = "mfc.hpp"; sourceTree = "<group>"; };
+		B4E39A4BA04B611909B7752F /* windows.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "windows.hpp"; path = "windows.hpp"; sourceTree = "<group>"; };
+		9E7035588A57F74F33A85D6D /* crc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "crc.hpp"; path = "crc.hpp"; sourceTree = "<group>"; };
+		AC2E9BF998D70229C16D1EA8 /* tests_crc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_crc.hpp"; path = "tests_crc.hpp"; sourceTree = "<group>"; };
+		FB92CED56703D14E30224BD7 /* exception.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "exception.hpp"; path = "exception.hpp"; sourceTree = "<group>"; };
+		D277709CBEF463DFE77164F3 /* hash.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "hash.hpp"; path = "hash.hpp"; sourceTree = "<group>"; };
+		FC9FF0F0682FB2DB712B93F3 /* jwk.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "jwk.hpp"; path = "jwk.hpp"; sourceTree = "<group>"; };
+		1FDC6ACC0B86A0DBF456A8F6 /* tests_crypto.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_crypto.hpp"; path = "tests_crypto.hpp"; sourceTree = "<group>"; };
+		BB351E1027C5DFFA30C1C012 /* mfc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "mfc.hpp"; path = "mfc.hpp"; sourceTree = "<group>"; };
+		7B378CD2E7FDE8EE30597751 /* nlohmann_json.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "nlohmann_json.hpp"; path = "nlohmann_json.hpp"; sourceTree = "<group>"; };
+		352D9BC9A1F3F7E5EA4E8648 /* floatingpoint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "floatingpoint.hpp"; path = "floatingpoint.hpp"; sourceTree = "<group>"; };
+		271A49A1937FDC271C587E00 /* integer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "integer.hpp"; path = "integer.hpp"; sourceTree = "<group>"; };
+		FC15C013E8AC02C9916179C9 /* tests_endian_floatingpoint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_endian_floatingpoint.hpp"; path = "tests_endian_floatingpoint.hpp"; sourceTree = "<group>"; };
+		6E4E7DA05A24049E43CE1EF1 /* tests_endian_integer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_endian_integer.hpp"; path = "tests_endian_integer.hpp"; sourceTree = "<group>"; };
+		53F2C88C3F317308E8B34F3A /* environment.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "environment.hpp"; path = "environment.hpp"; sourceTree = "<group>"; };
+		922031457EE0C1E9E7FDA9F4 /* exception_text.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "exception_text.hpp"; path = "exception_text.hpp"; sourceTree = "<group>"; };
+		C3C5DEE1AF17B6D19836F3E1 /* json.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "json.hpp"; path = "json.hpp"; sourceTree = "<group>"; };
+		58ECD0E74469C42A6DE6C43E /* mutex.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "mutex.hpp"; path = "mutex.hpp"; sourceTree = "<group>"; };
+		AAA7D04116B978E89F0A0B28 /* windows_version.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "windows_version.hpp"; path = "windows_version.hpp"; sourceTree = "<group>"; };
+		D7323E80C3078633ECB6C52F /* out_of_memory.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "out_of_memory.hpp"; path = "out_of_memory.hpp"; sourceTree = "<group>"; };
+		3B50156AA76A780BF08C889F /* crand.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "crand.hpp"; path = "crand.hpp"; sourceTree = "<group>"; };
+		70456B4FDC5613F665A8A535 /* default_engines.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "default_engines.hpp"; path = "default_engines.hpp"; sourceTree = "<group>"; };
+		75746B7F61DC314DCA474663 /* device.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "device.hpp"; path = "device.hpp"; sourceTree = "<group>"; };
+		1D18D55009809B1E72EBAF34 /* engine.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "engine.hpp"; path = "engine.hpp"; sourceTree = "<group>"; };
+		54BF328A403D8323293541BB /* engine_lcg.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "engine_lcg.hpp"; path = "engine_lcg.hpp"; sourceTree = "<group>"; };
+		2C0C322C1874F8F981DF0C10 /* random.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "random.hpp"; path = "random.hpp"; sourceTree = "<group>"; };
+		85C1D6EE713ECA319ABBCA45 /* seed.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "seed.hpp"; path = "seed.hpp"; sourceTree = "<group>"; };
+		BC8A232EA834593D91056158 /* tests_random.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_random.hpp"; path = "tests_random.hpp"; sourceTree = "<group>"; };
+		7A52207166BAE63ECF25FB54 /* buffer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "buffer.hpp"; path = "buffer.hpp"; sourceTree = "<group>"; };
+		A3456BE00FABFE669883A03F /* convert.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "convert.hpp"; path = "convert.hpp"; sourceTree = "<group>"; };
+		E0B2BE69CC46B411350B0EC6 /* convert_macros.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "convert_macros.hpp"; path = "convert_macros.hpp"; sourceTree = "<group>"; };
+		07E8B2CAF3E846451CB1B3C9 /* format_default_floatingpoint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_default_floatingpoint.hpp"; path = "format_default_floatingpoint.hpp"; sourceTree = "<group>"; };
+		BFA4F3FEAB0FB40A542B1970 /* format_default_formatter.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_default_formatter.hpp"; path = "format_default_formatter.hpp"; sourceTree = "<group>"; };
+		3B1EEA7627DE7A1B90FB6226 /* format_default_integer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_default_integer.hpp"; path = "format_default_integer.hpp"; sourceTree = "<group>"; };
+		C6CED4E1324117FE7BD54C82 /* format_default_string.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_default_string.hpp"; path = "format_default_string.hpp"; sourceTree = "<group>"; };
+		B7F87AEDA38C70950C51CA49 /* format_helpers.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_helpers.hpp"; path = "format_helpers.hpp"; sourceTree = "<group>"; };
+		EBA6A29AD73A984240FFF1F6 /* format_message.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_message.hpp"; path = "format_message.hpp"; sourceTree = "<group>"; };
+		518D2BEABDFF6D060694A38A /* format_message_macros.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_message_macros.hpp"; path = "format_message_macros.hpp"; sourceTree = "<group>"; };
+		D401362840C89244892321A7 /* format_simple.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_simple.hpp"; path = "format_simple.hpp"; sourceTree = "<group>"; };
+		B3F311931F877341286EE3F7 /* format_simple_floatingpoint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_simple_floatingpoint.hpp"; path = "format_simple_floatingpoint.hpp"; sourceTree = "<group>"; };
+		5C6529F6C8D76B12116CA196 /* format_simple_integer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_simple_integer.hpp"; path = "format_simple_integer.hpp"; sourceTree = "<group>"; };
+		BBA6103AA750464990214E64 /* format_simple_spec.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_simple_spec.hpp"; path = "format_simple_spec.hpp"; sourceTree = "<group>"; };
+		DCBCA73148D70AD391F91A67 /* parse.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "parse.hpp"; path = "parse.hpp"; sourceTree = "<group>"; };
+		C8173AC334E00747FD701059 /* tests_string_buffer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_buffer.hpp"; path = "tests_string_buffer.hpp"; sourceTree = "<group>"; };
+		7149BE485D1F454646C95F99 /* tests_string_convert.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_convert.hpp"; path = "tests_string_convert.hpp"; sourceTree = "<group>"; };
+		B628FCAC229D910AEBE6DE19 /* tests_string_format_message.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_format_message.hpp"; path = "tests_string_format_message.hpp"; sourceTree = "<group>"; };
+		3D7A5A4A29119DFFD2C51300 /* tests_string_format_simple.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_format_simple.hpp"; path = "tests_string_format_simple.hpp"; sourceTree = "<group>"; };
+		0853BBE0F4BD7BEC9DD9E051 /* tests_string_parse.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_parse.hpp"; path = "tests_string_parse.hpp"; sourceTree = "<group>"; };
+		23D7596A0FADE067F856FBBA /* tests_string_utility.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_utility.hpp"; path = "tests_string_utility.hpp"; sourceTree = "<group>"; };
+		5CBE19A3C8D87C4411FB8CD8 /* types.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "types.hpp"; path = "types.hpp"; sourceTree = "<group>"; };
+		9446926E00AC25F58984C7CD /* utility.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "utility.hpp"; path = "utility.hpp"; sourceTree = "<group>"; };
+		28F7ADCD14A1E3DCFD71EBF7 /* system_error.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "system_error.hpp"; path = "system_error.hpp"; sourceTree = "<group>"; };
+		8FE69E037B3876F36457B303 /* test.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "test.hpp"; path = "test.hpp"; sourceTree = "<group>"; };
+		7599632DE10966A6AA28E02E /* test_macros.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "test_macros.hpp"; path = "test_macros.hpp"; sourceTree = "<group>"; };
+		EB79DE7AD7CBB56AC0EAF27A /* guid.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "guid.hpp"; path = "guid.hpp"; sourceTree = "<group>"; };
+		708D205D5C211605C5E56FB9 /* tests_uuid.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_uuid.hpp"; path = "tests_uuid.hpp"; sourceTree = "<group>"; };
+		FE462636EA98FD25D3B73A36 /* uuid.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "uuid.hpp"; path = "uuid.hpp"; sourceTree = "<group>"; };
+		254477ED1146BBFDFAC8B1F6 /* tests_uuid_namespace.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_uuid_namespace.hpp"; path = "tests_uuid_namespace.hpp"; sourceTree = "<group>"; };
+		336CABEC1F2C3C918849249C /* uuid_namespace.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "uuid_namespace.hpp"; path = "uuid_namespace.hpp"; sourceTree = "<group>"; };
 		C1F3343CADAE24E856669D32 /* liblibopenmpt.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; name = "liblibopenmpt.dylib"; path = "liblibopenmpt.dylib"; sourceTree = BUILT_PRODUCTS_DIR; };
 		C6AF7A2032CC6C11FBA3D97E /* mpg123.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "mpg123.xcodeproj"; path = "ext/mpg123.xcodeproj"; sourceTree = SOURCE_ROOT; };
 		BC5DDB23287ACD14F1513A82 /* vorbis.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "vorbis.xcodeproj"; path = "ext/vorbis.xcodeproj"; sourceTree = SOURCE_ROOT; };
@@ -605,7 +809,7 @@
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
-		3C7629FAA88B9750314871B1 /* Frameworks */ = {
+		3C1FC60EA834346531F10DC6 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -626,8 +830,9 @@
 				4FEAB79B3BFA636CA4B3C88A /* soundbase */,
 				5A30E327C6F216B20FA3A53E /* sounddsp */,
 				E961CB335524FFBD9ED48D4A /* soundlib */,
-				9E6A03080A2D379253DDC51E /* Products */,
-				B533D44521F607D06AA6965C /* Projects */,
+				526061A83EEFEA71E70DFF6C /* src */,
+				E76F6E305332A2BA9CE23047 /* Products */,
+				FE383F6E6AFB72F8B3AB0185 /* Projects */,
 			);
 			name = "libopenmpt";
 			path = ".";
@@ -961,15 +1166,386 @@
 			path = "dmo";
 			sourceTree = "<group>";
 		};
-		9E6A03080A2D379253DDC51E /* Products */ = {
+		526061A83EEFEA71E70DFF6C /* src */ = {
 			isa = PBXGroup;
 			children = (
+				F3AC3E46DFD18DC6081D7356 /* mpt */,
+			);
+			name = "src";
+			path = "../../src";
+			sourceTree = "<group>";
+		};
+		F3AC3E46DFD18DC6081D7356 /* mpt */ = {
+			isa = PBXGroup;
+			children = (
+				1E2A22788A4209A253EF983B /* base */,
+				C53BE9A9311FF8E93A222626 /* binary */,
+				9F15441C8B3B0E837481934E /* check */,
+				008632CAEC40227695F89AC0 /* crc */,
+				8667A838F24AB778FB4DE5B4 /* crypto */,
+				FF2FC9176B13D85774160694 /* detect */,
+				3A25111FA608205FAF0B4E9B /* endian */,
+				21F767D10DDE29C9B62E90E6 /* environment */,
+				794A3DD3E5D9FEBDEED5DFD5 /* exception_text */,
+				03D1CA376FE9B161389641FB /* json */,
+				DFE4D8F0CB0AA357B4502823 /* mutex */,
+				74BFBCCEE0A2CB0EE9A5F94A /* osinfo */,
+				AD1D35B5996F0CA5828E49B5 /* out_of_memory */,
+				ED8B8820596F97606272C59C /* random */,
+				9A9F4703068356430F86847F /* string */,
+				D440C35E4005C24E096BF218 /* system_error */,
+				89AE0F0DF5C6F636BE7386D0 /* test */,
+				1C85FA62889DE18C514A7126 /* uuid */,
+				709C11C4DC2BD3AEE527B4C6 /* uuid_namespace */,
+			);
+			name = "mpt";
+			path = "mpt";
+			sourceTree = "<group>";
+		};
+		1E2A22788A4209A253EF983B /* base */ = {
+			isa = PBXGroup;
+			children = (
+				CB5F32E137C5C567C09D6740 /* algorithm.hpp */,
+				31ABD04C9D3A9237A636734F /* alloc.hpp */,
+				CFA8EC5CBB3CE20424013CB9 /* arithmetic_shift.hpp */,
+				405E9187ACED5272B5E9338A /* array.hpp */,
+				224BB17F8E0FB06F5775E039 /* bit.hpp */,
+				87716DE6731AD5159CB0F094 /* check_platform.hpp */,
+				74155F7CE031516DA909BEDA /* compiletime_warning.hpp */,
+				6234A41DCEFA003A17568F9C /* constexpr_throw.hpp */,
+				5B1990F3479683367013844A /* detect.hpp */,
+				37739C93A339F9AFEC948712 /* detect_compiler.hpp */,
+				980934EB047A3664CD98B0EC /* detect_libc.hpp */,
+				4A0FB859B64A181DBF3F95AC /* detect_libcxx.hpp */,
+				4402303AB067C3C039406599 /* detect_os.hpp */,
+				DA450125468161E84F76DE77 /* detect_quirks.hpp */,
+				A3CED61B0F0A37DF18FFB36E /* floatingpoint.hpp */,
+				950801B4012364554A4574E9 /* integer.hpp */,
+				CEBD9467BA3A88AAE3B788BE /* macros.hpp */,
+				D58929FFC1DB00EFAAFA3DFF /* math.hpp */,
+				9D0B894289887C85B2057D99 /* memory.hpp */,
+				93EE5781FF53EB07882C8DE0 /* namespace.hpp */,
+				1B7BDC3F87953FE1D0B74F75 /* numeric.hpp */,
+				CBC19C5637DCFFF780FE0F8C /* pointer.hpp */,
+				3348E2A01FC6323A08BEF0D1 /* preprocessor.hpp */,
+				CFCA30133B0691D644FB0D66 /* saturate_cast.hpp */,
+				0E4DA715FAF50E45238C2AC4 /* saturate_round.hpp */,
+				E7FF40BDD37C3400FCF93414 /* secure.hpp */,
+				3BA460B82738566090FCAF14 /* semantic_version.hpp */,
+				2D78A5C5993E02E2E2999044 /* source_location.hpp */,
+				CFB31F52BB05F741A4243452 /* span.hpp */,
+				FC350F3D68EF79E7F14E94C1 /* tests */,
+				B7AE97A523C9FA466CEB0ADB /* utility.hpp */,
+				8BAE8EC4F7C8F16540EB01FA /* version.hpp */,
+				E3933AE14F5A97FD98B52560 /* wrapping_divide.hpp */,
+			);
+			name = "base";
+			path = "base";
+			sourceTree = "<group>";
+		};
+		FC350F3D68EF79E7F14E94C1 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				B5A0EB57210A81BAAA4D2F65 /* tests_base_arithmetic_shift.hpp */,
+				8F55448E7BFF799D64D081B8 /* tests_base_bit.hpp */,
+				DC33C46D481BAF635109B1DF /* tests_base_math.hpp */,
+				E793E1BDD3947538FC5CE2BC /* tests_base_saturate_cast.hpp */,
+				1DD48AA189F29E6ED2BFA480 /* tests_base_saturate_round.hpp */,
+				2B0E58AC17FAEF1B8070AF6E /* tests_base_wrapping_divide.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		C53BE9A9311FF8E93A222626 /* binary */ = {
+			isa = PBXGroup;
+			children = (
+				F0B09491DC185B5F45846F75 /* base64.hpp */,
+				A58508BF11F60A38DA1485C0 /* base64url.hpp */,
+				14649C3680F35D2189EF3E39 /* hex.hpp */,
+				CE3758AA3AFC569A03628764 /* tests */,
+			);
+			name = "binary";
+			path = "binary";
+			sourceTree = "<group>";
+		};
+		CE3758AA3AFC569A03628764 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				8BA7F3577751296760223182 /* tests_binary.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		9F15441C8B3B0E837481934E /* check */ = {
+			isa = PBXGroup;
+			children = (
+				7F168852EBA5493DF4A12A55 /* libc.hpp */,
+				3D019BE2295372D21272AFE2 /* mfc.hpp */,
+				B4E39A4BA04B611909B7752F /* windows.hpp */,
+			);
+			name = "check";
+			path = "check";
+			sourceTree = "<group>";
+		};
+		008632CAEC40227695F89AC0 /* crc */ = {
+			isa = PBXGroup;
+			children = (
+				9E7035588A57F74F33A85D6D /* crc.hpp */,
+				3C338CC3286F8F2D9181A724 /* tests */,
+			);
+			name = "crc";
+			path = "crc";
+			sourceTree = "<group>";
+		};
+		3C338CC3286F8F2D9181A724 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				AC2E9BF998D70229C16D1EA8 /* tests_crc.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		8667A838F24AB778FB4DE5B4 /* crypto */ = {
+			isa = PBXGroup;
+			children = (
+				FB92CED56703D14E30224BD7 /* exception.hpp */,
+				D277709CBEF463DFE77164F3 /* hash.hpp */,
+				FC9FF0F0682FB2DB712B93F3 /* jwk.hpp */,
+				861E2DB4F2E22BA4BB485C6E /* tests */,
+			);
+			name = "crypto";
+			path = "crypto";
+			sourceTree = "<group>";
+		};
+		861E2DB4F2E22BA4BB485C6E /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				1FDC6ACC0B86A0DBF456A8F6 /* tests_crypto.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		FF2FC9176B13D85774160694 /* detect */ = {
+			isa = PBXGroup;
+			children = (
+				BB351E1027C5DFFA30C1C012 /* mfc.hpp */,
+				7B378CD2E7FDE8EE30597751 /* nlohmann_json.hpp */,
+			);
+			name = "detect";
+			path = "detect";
+			sourceTree = "<group>";
+		};
+		3A25111FA608205FAF0B4E9B /* endian */ = {
+			isa = PBXGroup;
+			children = (
+				352D9BC9A1F3F7E5EA4E8648 /* floatingpoint.hpp */,
+				271A49A1937FDC271C587E00 /* integer.hpp */,
+				78658F09E4298EF9AD8FBEC3 /* tests */,
+			);
+			name = "endian";
+			path = "endian";
+			sourceTree = "<group>";
+		};
+		78658F09E4298EF9AD8FBEC3 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				FC15C013E8AC02C9916179C9 /* tests_endian_floatingpoint.hpp */,
+				6E4E7DA05A24049E43CE1EF1 /* tests_endian_integer.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		21F767D10DDE29C9B62E90E6 /* environment */ = {
+			isa = PBXGroup;
+			children = (
+				53F2C88C3F317308E8B34F3A /* environment.hpp */,
+			);
+			name = "environment";
+			path = "environment";
+			sourceTree = "<group>";
+		};
+		794A3DD3E5D9FEBDEED5DFD5 /* exception_text */ = {
+			isa = PBXGroup;
+			children = (
+				922031457EE0C1E9E7FDA9F4 /* exception_text.hpp */,
+			);
+			name = "exception_text";
+			path = "exception_text";
+			sourceTree = "<group>";
+		};
+		03D1CA376FE9B161389641FB /* json */ = {
+			isa = PBXGroup;
+			children = (
+				C3C5DEE1AF17B6D19836F3E1 /* json.hpp */,
+			);
+			name = "json";
+			path = "json";
+			sourceTree = "<group>";
+		};
+		DFE4D8F0CB0AA357B4502823 /* mutex */ = {
+			isa = PBXGroup;
+			children = (
+				58ECD0E74469C42A6DE6C43E /* mutex.hpp */,
+			);
+			name = "mutex";
+			path = "mutex";
+			sourceTree = "<group>";
+		};
+		74BFBCCEE0A2CB0EE9A5F94A /* osinfo */ = {
+			isa = PBXGroup;
+			children = (
+				AAA7D04116B978E89F0A0B28 /* windows_version.hpp */,
+			);
+			name = "osinfo";
+			path = "osinfo";
+			sourceTree = "<group>";
+		};
+		AD1D35B5996F0CA5828E49B5 /* out_of_memory */ = {
+			isa = PBXGroup;
+			children = (
+				D7323E80C3078633ECB6C52F /* out_of_memory.hpp */,
+			);
+			name = "out_of_memory";
+			path = "out_of_memory";
+			sourceTree = "<group>";
+		};
+		ED8B8820596F97606272C59C /* random */ = {
+			isa = PBXGroup;
+			children = (
+				3B50156AA76A780BF08C889F /* crand.hpp */,
+				70456B4FDC5613F665A8A535 /* default_engines.hpp */,
+				75746B7F61DC314DCA474663 /* device.hpp */,
+				1D18D55009809B1E72EBAF34 /* engine.hpp */,
+				54BF328A403D8323293541BB /* engine_lcg.hpp */,
+				2C0C322C1874F8F981DF0C10 /* random.hpp */,
+				85C1D6EE713ECA319ABBCA45 /* seed.hpp */,
+				838EBBB1EF52BAA1B8B8EA6B /* tests */,
+			);
+			name = "random";
+			path = "random";
+			sourceTree = "<group>";
+		};
+		838EBBB1EF52BAA1B8B8EA6B /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				BC8A232EA834593D91056158 /* tests_random.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		9A9F4703068356430F86847F /* string */ = {
+			isa = PBXGroup;
+			children = (
+				7A52207166BAE63ECF25FB54 /* buffer.hpp */,
+				A3456BE00FABFE669883A03F /* convert.hpp */,
+				E0B2BE69CC46B411350B0EC6 /* convert_macros.hpp */,
+				07E8B2CAF3E846451CB1B3C9 /* format_default_floatingpoint.hpp */,
+				BFA4F3FEAB0FB40A542B1970 /* format_default_formatter.hpp */,
+				3B1EEA7627DE7A1B90FB6226 /* format_default_integer.hpp */,
+				C6CED4E1324117FE7BD54C82 /* format_default_string.hpp */,
+				B7F87AEDA38C70950C51CA49 /* format_helpers.hpp */,
+				EBA6A29AD73A984240FFF1F6 /* format_message.hpp */,
+				518D2BEABDFF6D060694A38A /* format_message_macros.hpp */,
+				D401362840C89244892321A7 /* format_simple.hpp */,
+				B3F311931F877341286EE3F7 /* format_simple_floatingpoint.hpp */,
+				5C6529F6C8D76B12116CA196 /* format_simple_integer.hpp */,
+				BBA6103AA750464990214E64 /* format_simple_spec.hpp */,
+				DCBCA73148D70AD391F91A67 /* parse.hpp */,
+				2097B90E8C5BB8FE55C1E8C8 /* tests */,
+				5CBE19A3C8D87C4411FB8CD8 /* types.hpp */,
+				9446926E00AC25F58984C7CD /* utility.hpp */,
+			);
+			name = "string";
+			path = "string";
+			sourceTree = "<group>";
+		};
+		2097B90E8C5BB8FE55C1E8C8 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				C8173AC334E00747FD701059 /* tests_string_buffer.hpp */,
+				7149BE485D1F454646C95F99 /* tests_string_convert.hpp */,
+				B628FCAC229D910AEBE6DE19 /* tests_string_format_message.hpp */,
+				3D7A5A4A29119DFFD2C51300 /* tests_string_format_simple.hpp */,
+				0853BBE0F4BD7BEC9DD9E051 /* tests_string_parse.hpp */,
+				23D7596A0FADE067F856FBBA /* tests_string_utility.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		D440C35E4005C24E096BF218 /* system_error */ = {
+			isa = PBXGroup;
+			children = (
+				28F7ADCD14A1E3DCFD71EBF7 /* system_error.hpp */,
+			);
+			name = "system_error";
+			path = "system_error";
+			sourceTree = "<group>";
+		};
+		89AE0F0DF5C6F636BE7386D0 /* test */ = {
+			isa = PBXGroup;
+			children = (
+				8FE69E037B3876F36457B303 /* test.hpp */,
+				7599632DE10966A6AA28E02E /* test_macros.hpp */,
+			);
+			name = "test";
+			path = "test";
+			sourceTree = "<group>";
+		};
+		1C85FA62889DE18C514A7126 /* uuid */ = {
+			isa = PBXGroup;
+			children = (
+				EB79DE7AD7CBB56AC0EAF27A /* guid.hpp */,
+				218629608D3F940A169FAEE4 /* tests */,
+				FE462636EA98FD25D3B73A36 /* uuid.hpp */,
+			);
+			name = "uuid";
+			path = "uuid";
+			sourceTree = "<group>";
+		};
+		218629608D3F940A169FAEE4 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				708D205D5C211605C5E56FB9 /* tests_uuid.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		709C11C4DC2BD3AEE527B4C6 /* uuid_namespace */ = {
+			isa = PBXGroup;
+			children = (
+				AAA9EFDC161AF255DF386CDE /* tests */,
+				336CABEC1F2C3C918849249C /* uuid_namespace.hpp */,
+			);
+			name = "uuid_namespace";
+			path = "uuid_namespace";
+			sourceTree = "<group>";
+		};
+		AAA9EFDC161AF255DF386CDE /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				254477ED1146BBFDFAC8B1F6 /* tests_uuid_namespace.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		E76F6E305332A2BA9CE23047 /* Products */ = {
+			isa = PBXGroup;
+			children = (
 				C1F3343CADAE24E856669D32 /* liblibopenmpt.dylib */,
 			);
 			name = "Products";
 			sourceTree = "<group>";
 		};
-		B533D44521F607D06AA6965C /* Projects */ = {
+		FE383F6E6AFB72F8B3AB0185 /* Projects */ = {
 			isa = PBXGroup;
 			children = (
 				C6AF7A2032CC6C11FBA3D97E /* mpg123.xcodeproj */,
@@ -1009,11 +1585,11 @@
 /* Begin PBXNativeTarget section */
 		87EFAFF2F3FCDDD87CE3D9C3 /* libopenmpt */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 388822CDA49D90232D5A6A84 /* Build configuration list for PBXNativeTarget "libopenmpt" */;
+			buildConfigurationList = C1D9DFDD2DEF4D34B6AB2795 /* Build configuration list for PBXNativeTarget "libopenmpt" */;
 			buildPhases = (
-				9A677A31067DE8878F39C2E8 /* Resources */,
-				120DD2957E2240EC07DF194D /* Sources */,
-				3C7629FAA88B9750314871B1 /* Frameworks */,
+				23B937428FCEA598188B7FF9 /* Resources */,
+				9B5E8FA60774FDFC9030D75D /* Sources */,
+				3C1FC60EA834346531F10DC6 /* Frameworks */,
 			);
 			buildRules = (
 			);
@@ -1083,7 +1659,7 @@
 /* End PBXReferenceProxy section */
 
 /* Begin PBXResourcesBuildPhase section */
-		9A677A31067DE8878F39C2E8 /* Resources */ = {
+		23B937428FCEA598188B7FF9 /* Resources */ = {
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -1093,7 +1669,7 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXSourcesBuildPhase section */
-		120DD2957E2240EC07DF194D /* Sources */ = {
+		9B5E8FA60774FDFC9030D75D /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -1310,6 +1886,17 @@
 				COPY_PHASE_STRIP = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
+				EXCLUDED_SOURCE_FILE_NAMES = (
+					"*/src/mpt/crypto/exception.hpp",
+					"*/src/mpt/crypto/hash.hpp",
+					"*/src/mpt/crypto/jwk.hpp",
+					"*/src/mpt/crypto/tests/tests_crypto.hpp",
+					"*/src/mpt/json/json.hpp",
+					"*/src/mpt/test/test.hpp",
+					"*/src/mpt/test/test_macros.hpp",
+					"*/src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp",
+					"*/src/mpt/uuid_namespace/uuid_namespace.hpp",
+				);
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_NO_COMMON_BLOCKS = YES;
@@ -1334,6 +1921,7 @@
 					../../include/ogg/include,
 					../../include/vorbis/include,
 					../..,
+					../../src,
 					../../common,
 					../../soundlib,
 					"$(IntDir)/svn_version",
@@ -1371,6 +1959,17 @@
 				CONFIGURATION_TEMP_DIR = "$(OBJROOT)";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
+				EXCLUDED_SOURCE_FILE_NAMES = (
+					"*/src/mpt/crypto/exception.hpp",
+					"*/src/mpt/crypto/hash.hpp",
+					"*/src/mpt/crypto/jwk.hpp",
+					"*/src/mpt/crypto/tests/tests_crypto.hpp",
+					"*/src/mpt/json/json.hpp",
+					"*/src/mpt/test/test.hpp",
+					"*/src/mpt/test/test_macros.hpp",
+					"*/src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp",
+					"*/src/mpt/uuid_namespace/uuid_namespace.hpp",
+				);
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_OPTIMIZATION_LEVEL = 3;
@@ -1393,6 +1992,7 @@
 					../../include/ogg/include,
 					../../include/vorbis/include,
 					../..,
+					../../src,
 					../../common,
 					../../soundlib,
 					"$(IntDir)/svn_version",
@@ -1417,7 +2017,7 @@
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
-		388822CDA49D90232D5A6A84 /* Build configuration list for PBXNativeTarget "liblibopenmpt.dylib" */ = {
+		C1D9DFDD2DEF4D34B6AB2795 /* Build configuration list for PBXNativeTarget "liblibopenmpt.dylib" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				09B8609D754722887E4303A0 /* Debug */,
Index: build/xcode9-macosx/ext/vorbis.xcodeproj/project.pbxproj
===================================================================
--- build/xcode9-macosx/ext/vorbis.xcodeproj/project.pbxproj	(revision 14628)
+++ build/xcode9-macosx/ext/vorbis.xcodeproj/project.pbxproj	(working copy)
@@ -195,7 +195,7 @@
 				B52E177AA13EC34A0AF82769 /* vorbis */,
 			);
 			name = "include";
-			path = "../../include";
+			path = "../../../include";
 			sourceTree = "<group>";
 		};
 		B52E177AA13EC34A0AF82769 /* vorbis */ = {
Index: build/xcode9-macosx/libopenmpt.xcodeproj/project.pbxproj
===================================================================
--- build/xcode9-macosx/libopenmpt.xcodeproj/project.pbxproj	(revision 14628)
+++ build/xcode9-macosx/libopenmpt.xcodeproj/project.pbxproj	(working copy)
@@ -277,6 +277,108 @@
 		7F669750EB773FF774C9D136 /* tuningCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6E6ED48B5AEC242543E4E2BC /* tuningCollection.cpp */; };
 		35D73C77A13CD0FD2A1572D6 /* tuningbase.h in Headers */ = {isa = PBXBuildFile; fileRef = 64866C7650D8436639F78076 /* tuningbase.h */; };
 		FF0E654E6BD5C16AB43050CD /* tuningcollection.h in Headers */ = {isa = PBXBuildFile; fileRef = D7109B26C3239B7F6C0D786C /* tuningcollection.h */; };
+		9C15752988BEDC58B154F8D7 /* algorithm.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CB5F32E137C5C567C09D6740 /* algorithm.hpp */; };
+		427834F72E8B3450D774113D /* alloc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 31ABD04C9D3A9237A636734F /* alloc.hpp */; };
+		00AE5F976C954A8D75834C09 /* arithmetic_shift.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CFA8EC5CBB3CE20424013CB9 /* arithmetic_shift.hpp */; };
+		B16C5A989D7F5AF1466937DE /* array.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 405E9187ACED5272B5E9338A /* array.hpp */; };
+		93D2D2157F3A99E3E8A5ADF9 /* bit.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 224BB17F8E0FB06F5775E039 /* bit.hpp */; };
+		78ED28CCE4091BBDADE1872A /* check_platform.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 87716DE6731AD5159CB0F094 /* check_platform.hpp */; };
+		25C236D01182C7747A9FAF7F /* compiletime_warning.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 74155F7CE031516DA909BEDA /* compiletime_warning.hpp */; };
+		53CD658F3F779B9E2848A3B9 /* constexpr_throw.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6234A41DCEFA003A17568F9C /* constexpr_throw.hpp */; };
+		CC485B3F38B95DB801D8D740 /* detect.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 5B1990F3479683367013844A /* detect.hpp */; };
+		48990F11344345201D144D3B /* detect_compiler.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 37739C93A339F9AFEC948712 /* detect_compiler.hpp */; };
+		C9FB6C23B58F62CB1E54BC7F /* detect_libc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 980934EB047A3664CD98B0EC /* detect_libc.hpp */; };
+		FB84DB9FE7C3851B9046624D /* detect_libcxx.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 4A0FB859B64A181DBF3F95AC /* detect_libcxx.hpp */; };
+		B52B88A6A1D4EFD5CA6A0B55 /* detect_os.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 4402303AB067C3C039406599 /* detect_os.hpp */; };
+		8B553D277794E7A22017C4D4 /* detect_quirks.hpp in Headers */ = {isa = PBXBuildFile; fileRef = DA450125468161E84F76DE77 /* detect_quirks.hpp */; };
+		F4C3A4BDE0024F3989852B6B /* floatingpoint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A3CED61B0F0A37DF18FFB36E /* floatingpoint.hpp */; };
+		66C8DD7952462E133B3EECAA /* integer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 950801B4012364554A4574E9 /* integer.hpp */; };
+		1FAD27708B1D2AE9543CA471 /* macros.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CEBD9467BA3A88AAE3B788BE /* macros.hpp */; };
+		46A92A05B20EBE8B3BE75F64 /* math.hpp in Headers */ = {isa = PBXBuildFile; fileRef = D58929FFC1DB00EFAAFA3DFF /* math.hpp */; };
+		4EF4AFC3BA64B23C83832CC5 /* memory.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 9D0B894289887C85B2057D99 /* memory.hpp */; };
+		6421CBB750CA32E779604E66 /* namespace.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 93EE5781FF53EB07882C8DE0 /* namespace.hpp */; };
+		ACBE43CB983C9464813452FC /* numeric.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 1B7BDC3F87953FE1D0B74F75 /* numeric.hpp */; };
+		5CB3ABFD4831FC963129BA2E /* pointer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CBC19C5637DCFFF780FE0F8C /* pointer.hpp */; };
+		6423BD90D03465375986F776 /* preprocessor.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3348E2A01FC6323A08BEF0D1 /* preprocessor.hpp */; };
+		A03B3F6F8C7AE9EA35FDC51C /* saturate_cast.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CFCA30133B0691D644FB0D66 /* saturate_cast.hpp */; };
+		5F15AC7BCB319E6C94090BDA /* saturate_round.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 0E4DA715FAF50E45238C2AC4 /* saturate_round.hpp */; };
+		D8261E60449720D90DB69A61 /* secure.hpp in Headers */ = {isa = PBXBuildFile; fileRef = E7FF40BDD37C3400FCF93414 /* secure.hpp */; };
+		ECAC758D58946083618262FF /* semantic_version.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3BA460B82738566090FCAF14 /* semantic_version.hpp */; };
+		FE273083EAD16592D3A26DAD /* source_location.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 2D78A5C5993E02E2E2999044 /* source_location.hpp */; };
+		801F8C8CEC841F13755DC1EB /* span.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CFB31F52BB05F741A4243452 /* span.hpp */; };
+		C68BD202B2B81E34DB99C144 /* tests_base_arithmetic_shift.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B5A0EB57210A81BAAA4D2F65 /* tests_base_arithmetic_shift.hpp */; };
+		40FBF82DACB8A16435838DCC /* tests_base_bit.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 8F55448E7BFF799D64D081B8 /* tests_base_bit.hpp */; };
+		CD858060B9F0406C620CA6D1 /* tests_base_math.hpp in Headers */ = {isa = PBXBuildFile; fileRef = DC33C46D481BAF635109B1DF /* tests_base_math.hpp */; };
+		0FF84D797B6CE3D644B630E6 /* tests_base_saturate_cast.hpp in Headers */ = {isa = PBXBuildFile; fileRef = E793E1BDD3947538FC5CE2BC /* tests_base_saturate_cast.hpp */; };
+		EE5B202ADA5D643AC3E05A33 /* tests_base_saturate_round.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 1DD48AA189F29E6ED2BFA480 /* tests_base_saturate_round.hpp */; };
+		DCEE6CA4482E31BD510EF8D4 /* tests_base_wrapping_divide.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 2B0E58AC17FAEF1B8070AF6E /* tests_base_wrapping_divide.hpp */; };
+		C893DB60B4112CFA9D09EA91 /* utility.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B7AE97A523C9FA466CEB0ADB /* utility.hpp */; };
+		1C988F0B0816E0A4F10D9E3C /* version.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 8BAE8EC4F7C8F16540EB01FA /* version.hpp */; };
+		8BC8C5817772FB90604303AC /* wrapping_divide.hpp in Headers */ = {isa = PBXBuildFile; fileRef = E3933AE14F5A97FD98B52560 /* wrapping_divide.hpp */; };
+		C16138A92D9D986C369215FC /* base64.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F0B09491DC185B5F45846F75 /* base64.hpp */; };
+		F607C2D9E29BB7814B601136 /* base64url.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A58508BF11F60A38DA1485C0 /* base64url.hpp */; };
+		053796FEF14996579A337344 /* hex.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 14649C3680F35D2189EF3E39 /* hex.hpp */; };
+		3334DC8F9FF184C628BC702E /* tests_binary.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 8BA7F3577751296760223182 /* tests_binary.hpp */; };
+		502439753C3739CEE52016BB /* libc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 7F168852EBA5493DF4A12A55 /* libc.hpp */; };
+		AE01B73F1A674AC6A33FEC9E /* mfc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D019BE2295372D21272AFE2 /* mfc.hpp */; };
+		05EF2002712A81C57A1FFE54 /* windows.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B4E39A4BA04B611909B7752F /* windows.hpp */; };
+		26CB79B992E5DC5ADB07EDEE /* crc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 9E7035588A57F74F33A85D6D /* crc.hpp */; };
+		BDA9C31829C6B509F29D2277 /* tests_crc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = AC2E9BF998D70229C16D1EA8 /* tests_crc.hpp */; };
+		0CDBF337F86EE9DF61334394 /* exception.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FB92CED56703D14E30224BD7 /* exception.hpp */; };
+		A349BCCE0FBABE47D8D838D0 /* hash.hpp in Headers */ = {isa = PBXBuildFile; fileRef = D277709CBEF463DFE77164F3 /* hash.hpp */; };
+		44CEA27030E1A2C9D9CA7FB6 /* jwk.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FC9FF0F0682FB2DB712B93F3 /* jwk.hpp */; };
+		D01B0A173CD9B24DC5A39EB5 /* tests_crypto.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 1FDC6ACC0B86A0DBF456A8F6 /* tests_crypto.hpp */; };
+		0C2970FCF83B7055A1254D42 /* mfc.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BB351E1027C5DFFA30C1C012 /* mfc.hpp */; };
+		0CA818CFF8514EDEE12256F9 /* nlohmann_json.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 7B378CD2E7FDE8EE30597751 /* nlohmann_json.hpp */; };
+		0642A890F2EBDD9FDBBCE5BA /* floatingpoint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 352D9BC9A1F3F7E5EA4E8648 /* floatingpoint.hpp */; };
+		78A96A1D6452D24C8DE8EDCB /* integer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 271A49A1937FDC271C587E00 /* integer.hpp */; };
+		8DCD11FCF997E356429EE27B /* tests_endian_floatingpoint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FC15C013E8AC02C9916179C9 /* tests_endian_floatingpoint.hpp */; };
+		7F682B86EBD1C0E874156F93 /* tests_endian_integer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 6E4E7DA05A24049E43CE1EF1 /* tests_endian_integer.hpp */; };
+		44564418B0C88634F95CBCB8 /* environment.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 53F2C88C3F317308E8B34F3A /* environment.hpp */; };
+		A308F4920F9C55411883C5F7 /* exception_text.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 922031457EE0C1E9E7FDA9F4 /* exception_text.hpp */; };
+		F48988AC60EF1B33E9C7BD0B /* json.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C3C5DEE1AF17B6D19836F3E1 /* json.hpp */; };
+		20779C208CE79E9955061922 /* mutex.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 58ECD0E74469C42A6DE6C43E /* mutex.hpp */; };
+		DBD126C7C7A66E7AF055AE76 /* windows_version.hpp in Headers */ = {isa = PBXBuildFile; fileRef = AAA7D04116B978E89F0A0B28 /* windows_version.hpp */; };
+		C8512EC7341AFC4AFDAA045D /* out_of_memory.hpp in Headers */ = {isa = PBXBuildFile; fileRef = D7323E80C3078633ECB6C52F /* out_of_memory.hpp */; };
+		CCC7EE3DB8453FD7A13DFD6E /* crand.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3B50156AA76A780BF08C889F /* crand.hpp */; };
+		61FBC86C4DD01020767F501C /* default_engines.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 70456B4FDC5613F665A8A535 /* default_engines.hpp */; };
+		6620FFC0D25B5F84DB50DC13 /* device.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 75746B7F61DC314DCA474663 /* device.hpp */; };
+		0E4DC99C7A882960837DA6EF /* engine.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 1D18D55009809B1E72EBAF34 /* engine.hpp */; };
+		2537EAAE914892551A9A2495 /* engine_lcg.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 54BF328A403D8323293541BB /* engine_lcg.hpp */; };
+		7D225C3FE95DBC02F2523992 /* random.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 2C0C322C1874F8F981DF0C10 /* random.hpp */; };
+		369B037BA20B06F46B2A807C /* seed.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 85C1D6EE713ECA319ABBCA45 /* seed.hpp */; };
+		8D74999BF93142D282FC2D3A /* tests_random.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BC8A232EA834593D91056158 /* tests_random.hpp */; };
+		8B8918C8F7C4788B00BAF51A /* buffer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 7A52207166BAE63ECF25FB54 /* buffer.hpp */; };
+		7462DF90600B47C089A1623F /* convert.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A3456BE00FABFE669883A03F /* convert.hpp */; };
+		B1AAAFF21D929AE826809C64 /* convert_macros.hpp in Headers */ = {isa = PBXBuildFile; fileRef = E0B2BE69CC46B411350B0EC6 /* convert_macros.hpp */; };
+		F8158C97648A21F52DD46E04 /* format_default_floatingpoint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 07E8B2CAF3E846451CB1B3C9 /* format_default_floatingpoint.hpp */; };
+		303D13D59C5B27A2E5282DB4 /* format_default_formatter.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BFA4F3FEAB0FB40A542B1970 /* format_default_formatter.hpp */; };
+		ECF70A4B588B6CF96172DCAF /* format_default_integer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3B1EEA7627DE7A1B90FB6226 /* format_default_integer.hpp */; };
+		37F72B8523CDB2820C77CDD5 /* format_default_string.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C6CED4E1324117FE7BD54C82 /* format_default_string.hpp */; };
+		E82E641554164F0B5D045187 /* format_helpers.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B7F87AEDA38C70950C51CA49 /* format_helpers.hpp */; };
+		9CDDD46D08C5BF6311B3C1DF /* format_message.hpp in Headers */ = {isa = PBXBuildFile; fileRef = EBA6A29AD73A984240FFF1F6 /* format_message.hpp */; };
+		A284A6AB8E5A2DA9770448FC /* format_message_macros.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 518D2BEABDFF6D060694A38A /* format_message_macros.hpp */; };
+		05D20B18F17B4127DA4C4942 /* format_simple.hpp in Headers */ = {isa = PBXBuildFile; fileRef = D401362840C89244892321A7 /* format_simple.hpp */; };
+		04F53466F08B771B9940EE1B /* format_simple_floatingpoint.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B3F311931F877341286EE3F7 /* format_simple_floatingpoint.hpp */; };
+		8D1BB4B179F13AAF629B5502 /* format_simple_integer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 5C6529F6C8D76B12116CA196 /* format_simple_integer.hpp */; };
+		ECE7C27158A56BA8E16F5710 /* format_simple_spec.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BBA6103AA750464990214E64 /* format_simple_spec.hpp */; };
+		0D4173F5F9BEC38EE2B68126 /* parse.hpp in Headers */ = {isa = PBXBuildFile; fileRef = DCBCA73148D70AD391F91A67 /* parse.hpp */; };
+		F94966FBE535FE6A4EACBDBD /* tests_string_buffer.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C8173AC334E00747FD701059 /* tests_string_buffer.hpp */; };
+		D98D77C845F70C2BCE3ABBD5 /* tests_string_convert.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 7149BE485D1F454646C95F99 /* tests_string_convert.hpp */; };
+		A710B1889328BC3DFCF79B02 /* tests_string_format_message.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B628FCAC229D910AEBE6DE19 /* tests_string_format_message.hpp */; };
+		6E026A3EDACC3B9923D33ABE /* tests_string_format_simple.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D7A5A4A29119DFFD2C51300 /* tests_string_format_simple.hpp */; };
+		19412077855F3444CE2C3A56 /* tests_string_parse.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 0853BBE0F4BD7BEC9DD9E051 /* tests_string_parse.hpp */; };
+		54AA52BDC013E81F495796CA /* tests_string_utility.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 23D7596A0FADE067F856FBBA /* tests_string_utility.hpp */; };
+		A4CEE429904C35C37944F35A /* types.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 5CBE19A3C8D87C4411FB8CD8 /* types.hpp */; };
+		05A29141F14AF9701AE114F0 /* utility.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 9446926E00AC25F58984C7CD /* utility.hpp */; };
+		7984746AE5411DA16E0C0909 /* system_error.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 28F7ADCD14A1E3DCFD71EBF7 /* system_error.hpp */; };
+		400A3967AC6FCCED35486EC6 /* test.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 8FE69E037B3876F36457B303 /* test.hpp */; };
+		5DCDC2754961B81DB22512D2 /* test_macros.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 7599632DE10966A6AA28E02E /* test_macros.hpp */; };
+		1C17C7FA887C5A811155FC59 /* guid.hpp in Headers */ = {isa = PBXBuildFile; fileRef = EB79DE7AD7CBB56AC0EAF27A /* guid.hpp */; };
+		419F30FFAD861BF5B6741D71 /* tests_uuid.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 708D205D5C211605C5E56FB9 /* tests_uuid.hpp */; };
+		0F0849387B6DDCBE04467E97 /* uuid.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FE462636EA98FD25D3B73A36 /* uuid.hpp */; };
+		9699775002AFE5A68B6BBF07 /* tests_uuid_namespace.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 254477ED1146BBFDFAC8B1F6 /* tests_uuid_namespace.hpp */; };
+		E4C023615054850F593BF5C5 /* uuid_namespace.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 336CABEC1F2C3C918849249C /* uuid_namespace.hpp */; };
 		33F43B0D1FB76C31C8047EAD /* libopenmpt-mpg123.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C253023F2E93C65737738D6F /* libopenmpt-mpg123.dylib */; };
 		295F95881522C6ACBE6FD728 /* libopenmpt-vorbis.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F88CF99364CCBDAC6DAC84C4 /* libopenmpt-vorbis.dylib */; };
 		590C48B3450E8CC32E9182BC /* libopenmpt-ogg.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 88986B03F4B67FD03D8485E2 /* libopenmpt-ogg.dylib */; };
@@ -598,6 +700,108 @@
 		6E6ED48B5AEC242543E4E2BC /* tuningCollection.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "tuningCollection.cpp"; path = "tuningCollection.cpp"; sourceTree = "<group>"; };
 		64866C7650D8436639F78076 /* tuningbase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "tuningbase.h"; path = "tuningbase.h"; sourceTree = "<group>"; };
 		D7109B26C3239B7F6C0D786C /* tuningcollection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "tuningcollection.h"; path = "tuningcollection.h"; sourceTree = "<group>"; };
+		CB5F32E137C5C567C09D6740 /* algorithm.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "algorithm.hpp"; path = "algorithm.hpp"; sourceTree = "<group>"; };
+		31ABD04C9D3A9237A636734F /* alloc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "alloc.hpp"; path = "alloc.hpp"; sourceTree = "<group>"; };
+		CFA8EC5CBB3CE20424013CB9 /* arithmetic_shift.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "arithmetic_shift.hpp"; path = "arithmetic_shift.hpp"; sourceTree = "<group>"; };
+		405E9187ACED5272B5E9338A /* array.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "array.hpp"; path = "array.hpp"; sourceTree = "<group>"; };
+		224BB17F8E0FB06F5775E039 /* bit.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "bit.hpp"; path = "bit.hpp"; sourceTree = "<group>"; };
+		87716DE6731AD5159CB0F094 /* check_platform.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "check_platform.hpp"; path = "check_platform.hpp"; sourceTree = "<group>"; };
+		74155F7CE031516DA909BEDA /* compiletime_warning.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "compiletime_warning.hpp"; path = "compiletime_warning.hpp"; sourceTree = "<group>"; };
+		6234A41DCEFA003A17568F9C /* constexpr_throw.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "constexpr_throw.hpp"; path = "constexpr_throw.hpp"; sourceTree = "<group>"; };
+		5B1990F3479683367013844A /* detect.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect.hpp"; path = "detect.hpp"; sourceTree = "<group>"; };
+		37739C93A339F9AFEC948712 /* detect_compiler.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect_compiler.hpp"; path = "detect_compiler.hpp"; sourceTree = "<group>"; };
+		980934EB047A3664CD98B0EC /* detect_libc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect_libc.hpp"; path = "detect_libc.hpp"; sourceTree = "<group>"; };
+		4A0FB859B64A181DBF3F95AC /* detect_libcxx.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect_libcxx.hpp"; path = "detect_libcxx.hpp"; sourceTree = "<group>"; };
+		4402303AB067C3C039406599 /* detect_os.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect_os.hpp"; path = "detect_os.hpp"; sourceTree = "<group>"; };
+		DA450125468161E84F76DE77 /* detect_quirks.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "detect_quirks.hpp"; path = "detect_quirks.hpp"; sourceTree = "<group>"; };
+		A3CED61B0F0A37DF18FFB36E /* floatingpoint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "floatingpoint.hpp"; path = "floatingpoint.hpp"; sourceTree = "<group>"; };
+		950801B4012364554A4574E9 /* integer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "integer.hpp"; path = "integer.hpp"; sourceTree = "<group>"; };
+		CEBD9467BA3A88AAE3B788BE /* macros.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "macros.hpp"; path = "macros.hpp"; sourceTree = "<group>"; };
+		D58929FFC1DB00EFAAFA3DFF /* math.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "math.hpp"; path = "math.hpp"; sourceTree = "<group>"; };
+		9D0B894289887C85B2057D99 /* memory.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "memory.hpp"; path = "memory.hpp"; sourceTree = "<group>"; };
+		93EE5781FF53EB07882C8DE0 /* namespace.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "namespace.hpp"; path = "namespace.hpp"; sourceTree = "<group>"; };
+		1B7BDC3F87953FE1D0B74F75 /* numeric.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "numeric.hpp"; path = "numeric.hpp"; sourceTree = "<group>"; };
+		CBC19C5637DCFFF780FE0F8C /* pointer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "pointer.hpp"; path = "pointer.hpp"; sourceTree = "<group>"; };
+		3348E2A01FC6323A08BEF0D1 /* preprocessor.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "preprocessor.hpp"; path = "preprocessor.hpp"; sourceTree = "<group>"; };
+		CFCA30133B0691D644FB0D66 /* saturate_cast.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "saturate_cast.hpp"; path = "saturate_cast.hpp"; sourceTree = "<group>"; };
+		0E4DA715FAF50E45238C2AC4 /* saturate_round.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "saturate_round.hpp"; path = "saturate_round.hpp"; sourceTree = "<group>"; };
+		E7FF40BDD37C3400FCF93414 /* secure.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "secure.hpp"; path = "secure.hpp"; sourceTree = "<group>"; };
+		3BA460B82738566090FCAF14 /* semantic_version.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "semantic_version.hpp"; path = "semantic_version.hpp"; sourceTree = "<group>"; };
+		2D78A5C5993E02E2E2999044 /* source_location.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "source_location.hpp"; path = "source_location.hpp"; sourceTree = "<group>"; };
+		CFB31F52BB05F741A4243452 /* span.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "span.hpp"; path = "span.hpp"; sourceTree = "<group>"; };
+		B5A0EB57210A81BAAA4D2F65 /* tests_base_arithmetic_shift.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_arithmetic_shift.hpp"; path = "tests_base_arithmetic_shift.hpp"; sourceTree = "<group>"; };
+		8F55448E7BFF799D64D081B8 /* tests_base_bit.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_bit.hpp"; path = "tests_base_bit.hpp"; sourceTree = "<group>"; };
+		DC33C46D481BAF635109B1DF /* tests_base_math.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_math.hpp"; path = "tests_base_math.hpp"; sourceTree = "<group>"; };
+		E793E1BDD3947538FC5CE2BC /* tests_base_saturate_cast.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_saturate_cast.hpp"; path = "tests_base_saturate_cast.hpp"; sourceTree = "<group>"; };
+		1DD48AA189F29E6ED2BFA480 /* tests_base_saturate_round.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_saturate_round.hpp"; path = "tests_base_saturate_round.hpp"; sourceTree = "<group>"; };
+		2B0E58AC17FAEF1B8070AF6E /* tests_base_wrapping_divide.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_base_wrapping_divide.hpp"; path = "tests_base_wrapping_divide.hpp"; sourceTree = "<group>"; };
+		B7AE97A523C9FA466CEB0ADB /* utility.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "utility.hpp"; path = "utility.hpp"; sourceTree = "<group>"; };
+		8BAE8EC4F7C8F16540EB01FA /* version.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "version.hpp"; path = "version.hpp"; sourceTree = "<group>"; };
+		E3933AE14F5A97FD98B52560 /* wrapping_divide.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "wrapping_divide.hpp"; path = "wrapping_divide.hpp"; sourceTree = "<group>"; };
+		F0B09491DC185B5F45846F75 /* base64.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "base64.hpp"; path = "base64.hpp"; sourceTree = "<group>"; };
+		A58508BF11F60A38DA1485C0 /* base64url.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "base64url.hpp"; path = "base64url.hpp"; sourceTree = "<group>"; };
+		14649C3680F35D2189EF3E39 /* hex.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "hex.hpp"; path = "hex.hpp"; sourceTree = "<group>"; };
+		8BA7F3577751296760223182 /* tests_binary.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_binary.hpp"; path = "tests_binary.hpp"; sourceTree = "<group>"; };
+		7F168852EBA5493DF4A12A55 /* libc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "libc.hpp"; path = "libc.hpp"; sourceTree = "<group>"; };
+		3D019BE2295372D21272AFE2 /* mfc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "mfc.hpp"; path = "mfc.hpp"; sourceTree = "<group>"; };
+		B4E39A4BA04B611909B7752F /* windows.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "windows.hpp"; path = "windows.hpp"; sourceTree = "<group>"; };
+		9E7035588A57F74F33A85D6D /* crc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "crc.hpp"; path = "crc.hpp"; sourceTree = "<group>"; };
+		AC2E9BF998D70229C16D1EA8 /* tests_crc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_crc.hpp"; path = "tests_crc.hpp"; sourceTree = "<group>"; };
+		FB92CED56703D14E30224BD7 /* exception.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "exception.hpp"; path = "exception.hpp"; sourceTree = "<group>"; };
+		D277709CBEF463DFE77164F3 /* hash.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "hash.hpp"; path = "hash.hpp"; sourceTree = "<group>"; };
+		FC9FF0F0682FB2DB712B93F3 /* jwk.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "jwk.hpp"; path = "jwk.hpp"; sourceTree = "<group>"; };
+		1FDC6ACC0B86A0DBF456A8F6 /* tests_crypto.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_crypto.hpp"; path = "tests_crypto.hpp"; sourceTree = "<group>"; };
+		BB351E1027C5DFFA30C1C012 /* mfc.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "mfc.hpp"; path = "mfc.hpp"; sourceTree = "<group>"; };
+		7B378CD2E7FDE8EE30597751 /* nlohmann_json.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "nlohmann_json.hpp"; path = "nlohmann_json.hpp"; sourceTree = "<group>"; };
+		352D9BC9A1F3F7E5EA4E8648 /* floatingpoint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "floatingpoint.hpp"; path = "floatingpoint.hpp"; sourceTree = "<group>"; };
+		271A49A1937FDC271C587E00 /* integer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "integer.hpp"; path = "integer.hpp"; sourceTree = "<group>"; };
+		FC15C013E8AC02C9916179C9 /* tests_endian_floatingpoint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_endian_floatingpoint.hpp"; path = "tests_endian_floatingpoint.hpp"; sourceTree = "<group>"; };
+		6E4E7DA05A24049E43CE1EF1 /* tests_endian_integer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_endian_integer.hpp"; path = "tests_endian_integer.hpp"; sourceTree = "<group>"; };
+		53F2C88C3F317308E8B34F3A /* environment.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "environment.hpp"; path = "environment.hpp"; sourceTree = "<group>"; };
+		922031457EE0C1E9E7FDA9F4 /* exception_text.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "exception_text.hpp"; path = "exception_text.hpp"; sourceTree = "<group>"; };
+		C3C5DEE1AF17B6D19836F3E1 /* json.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "json.hpp"; path = "json.hpp"; sourceTree = "<group>"; };
+		58ECD0E74469C42A6DE6C43E /* mutex.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "mutex.hpp"; path = "mutex.hpp"; sourceTree = "<group>"; };
+		AAA7D04116B978E89F0A0B28 /* windows_version.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "windows_version.hpp"; path = "windows_version.hpp"; sourceTree = "<group>"; };
+		D7323E80C3078633ECB6C52F /* out_of_memory.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "out_of_memory.hpp"; path = "out_of_memory.hpp"; sourceTree = "<group>"; };
+		3B50156AA76A780BF08C889F /* crand.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "crand.hpp"; path = "crand.hpp"; sourceTree = "<group>"; };
+		70456B4FDC5613F665A8A535 /* default_engines.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "default_engines.hpp"; path = "default_engines.hpp"; sourceTree = "<group>"; };
+		75746B7F61DC314DCA474663 /* device.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "device.hpp"; path = "device.hpp"; sourceTree = "<group>"; };
+		1D18D55009809B1E72EBAF34 /* engine.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "engine.hpp"; path = "engine.hpp"; sourceTree = "<group>"; };
+		54BF328A403D8323293541BB /* engine_lcg.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "engine_lcg.hpp"; path = "engine_lcg.hpp"; sourceTree = "<group>"; };
+		2C0C322C1874F8F981DF0C10 /* random.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "random.hpp"; path = "random.hpp"; sourceTree = "<group>"; };
+		85C1D6EE713ECA319ABBCA45 /* seed.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "seed.hpp"; path = "seed.hpp"; sourceTree = "<group>"; };
+		BC8A232EA834593D91056158 /* tests_random.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_random.hpp"; path = "tests_random.hpp"; sourceTree = "<group>"; };
+		7A52207166BAE63ECF25FB54 /* buffer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "buffer.hpp"; path = "buffer.hpp"; sourceTree = "<group>"; };
+		A3456BE00FABFE669883A03F /* convert.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "convert.hpp"; path = "convert.hpp"; sourceTree = "<group>"; };
+		E0B2BE69CC46B411350B0EC6 /* convert_macros.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "convert_macros.hpp"; path = "convert_macros.hpp"; sourceTree = "<group>"; };
+		07E8B2CAF3E846451CB1B3C9 /* format_default_floatingpoint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_default_floatingpoint.hpp"; path = "format_default_floatingpoint.hpp"; sourceTree = "<group>"; };
+		BFA4F3FEAB0FB40A542B1970 /* format_default_formatter.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_default_formatter.hpp"; path = "format_default_formatter.hpp"; sourceTree = "<group>"; };
+		3B1EEA7627DE7A1B90FB6226 /* format_default_integer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_default_integer.hpp"; path = "format_default_integer.hpp"; sourceTree = "<group>"; };
+		C6CED4E1324117FE7BD54C82 /* format_default_string.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_default_string.hpp"; path = "format_default_string.hpp"; sourceTree = "<group>"; };
+		B7F87AEDA38C70950C51CA49 /* format_helpers.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_helpers.hpp"; path = "format_helpers.hpp"; sourceTree = "<group>"; };
+		EBA6A29AD73A984240FFF1F6 /* format_message.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_message.hpp"; path = "format_message.hpp"; sourceTree = "<group>"; };
+		518D2BEABDFF6D060694A38A /* format_message_macros.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_message_macros.hpp"; path = "format_message_macros.hpp"; sourceTree = "<group>"; };
+		D401362840C89244892321A7 /* format_simple.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_simple.hpp"; path = "format_simple.hpp"; sourceTree = "<group>"; };
+		B3F311931F877341286EE3F7 /* format_simple_floatingpoint.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_simple_floatingpoint.hpp"; path = "format_simple_floatingpoint.hpp"; sourceTree = "<group>"; };
+		5C6529F6C8D76B12116CA196 /* format_simple_integer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_simple_integer.hpp"; path = "format_simple_integer.hpp"; sourceTree = "<group>"; };
+		BBA6103AA750464990214E64 /* format_simple_spec.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "format_simple_spec.hpp"; path = "format_simple_spec.hpp"; sourceTree = "<group>"; };
+		DCBCA73148D70AD391F91A67 /* parse.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "parse.hpp"; path = "parse.hpp"; sourceTree = "<group>"; };
+		C8173AC334E00747FD701059 /* tests_string_buffer.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_buffer.hpp"; path = "tests_string_buffer.hpp"; sourceTree = "<group>"; };
+		7149BE485D1F454646C95F99 /* tests_string_convert.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_convert.hpp"; path = "tests_string_convert.hpp"; sourceTree = "<group>"; };
+		B628FCAC229D910AEBE6DE19 /* tests_string_format_message.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_format_message.hpp"; path = "tests_string_format_message.hpp"; sourceTree = "<group>"; };
+		3D7A5A4A29119DFFD2C51300 /* tests_string_format_simple.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_format_simple.hpp"; path = "tests_string_format_simple.hpp"; sourceTree = "<group>"; };
+		0853BBE0F4BD7BEC9DD9E051 /* tests_string_parse.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_parse.hpp"; path = "tests_string_parse.hpp"; sourceTree = "<group>"; };
+		23D7596A0FADE067F856FBBA /* tests_string_utility.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_string_utility.hpp"; path = "tests_string_utility.hpp"; sourceTree = "<group>"; };
+		5CBE19A3C8D87C4411FB8CD8 /* types.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "types.hpp"; path = "types.hpp"; sourceTree = "<group>"; };
+		9446926E00AC25F58984C7CD /* utility.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "utility.hpp"; path = "utility.hpp"; sourceTree = "<group>"; };
+		28F7ADCD14A1E3DCFD71EBF7 /* system_error.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "system_error.hpp"; path = "system_error.hpp"; sourceTree = "<group>"; };
+		8FE69E037B3876F36457B303 /* test.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "test.hpp"; path = "test.hpp"; sourceTree = "<group>"; };
+		7599632DE10966A6AA28E02E /* test_macros.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "test_macros.hpp"; path = "test_macros.hpp"; sourceTree = "<group>"; };
+		EB79DE7AD7CBB56AC0EAF27A /* guid.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "guid.hpp"; path = "guid.hpp"; sourceTree = "<group>"; };
+		708D205D5C211605C5E56FB9 /* tests_uuid.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_uuid.hpp"; path = "tests_uuid.hpp"; sourceTree = "<group>"; };
+		FE462636EA98FD25D3B73A36 /* uuid.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "uuid.hpp"; path = "uuid.hpp"; sourceTree = "<group>"; };
+		254477ED1146BBFDFAC8B1F6 /* tests_uuid_namespace.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "tests_uuid_namespace.hpp"; path = "tests_uuid_namespace.hpp"; sourceTree = "<group>"; };
+		336CABEC1F2C3C918849249C /* uuid_namespace.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; name = "uuid_namespace.hpp"; path = "uuid_namespace.hpp"; sourceTree = "<group>"; };
 		C1F3343CADAE24E856669D32 /* liblibopenmpt.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; name = "liblibopenmpt.dylib"; path = "liblibopenmpt.dylib"; sourceTree = BUILT_PRODUCTS_DIR; };
 		8CACB699F8BD5E40810FF17F /* mpg123.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "mpg123.xcodeproj"; path = "ext/mpg123.xcodeproj"; sourceTree = SOURCE_ROOT; };
 		C22F9E152E4146BCB792D8FB /* vorbis.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "vorbis.xcodeproj"; path = "ext/vorbis.xcodeproj"; sourceTree = SOURCE_ROOT; };
@@ -605,7 +809,7 @@
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
-		824FCF41EE19A19C3720A0C1 /* Frameworks */ = {
+		82B82D05EE82FF5F3789FE84 /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -626,8 +830,9 @@
 				4FEAB79B3BFA636CA4B3C88A /* soundbase */,
 				5A30E327C6F216B20FA3A53E /* sounddsp */,
 				E961CB335524FFBD9ED48D4A /* soundlib */,
-				9E6A03080A2D379253DDC51E /* Products */,
-				B533D44521F607D06AA6965C /* Projects */,
+				526061A83EEFEA71E70DFF6C /* src */,
+				E76F6E305332A2BA9CE23047 /* Products */,
+				FE383F6E6AFB72F8B3AB0185 /* Projects */,
 			);
 			name = "libopenmpt";
 			path = ".";
@@ -961,15 +1166,386 @@
 			path = "dmo";
 			sourceTree = "<group>";
 		};
-		9E6A03080A2D379253DDC51E /* Products */ = {
+		526061A83EEFEA71E70DFF6C /* src */ = {
 			isa = PBXGroup;
 			children = (
+				F3AC3E46DFD18DC6081D7356 /* mpt */,
+			);
+			name = "src";
+			path = "../../src";
+			sourceTree = "<group>";
+		};
+		F3AC3E46DFD18DC6081D7356 /* mpt */ = {
+			isa = PBXGroup;
+			children = (
+				1E2A22788A4209A253EF983B /* base */,
+				C53BE9A9311FF8E93A222626 /* binary */,
+				9F15441C8B3B0E837481934E /* check */,
+				008632CAEC40227695F89AC0 /* crc */,
+				8667A838F24AB778FB4DE5B4 /* crypto */,
+				FF2FC9176B13D85774160694 /* detect */,
+				3A25111FA608205FAF0B4E9B /* endian */,
+				21F767D10DDE29C9B62E90E6 /* environment */,
+				794A3DD3E5D9FEBDEED5DFD5 /* exception_text */,
+				03D1CA376FE9B161389641FB /* json */,
+				DFE4D8F0CB0AA357B4502823 /* mutex */,
+				74BFBCCEE0A2CB0EE9A5F94A /* osinfo */,
+				AD1D35B5996F0CA5828E49B5 /* out_of_memory */,
+				ED8B8820596F97606272C59C /* random */,
+				9A9F4703068356430F86847F /* string */,
+				D440C35E4005C24E096BF218 /* system_error */,
+				89AE0F0DF5C6F636BE7386D0 /* test */,
+				1C85FA62889DE18C514A7126 /* uuid */,
+				709C11C4DC2BD3AEE527B4C6 /* uuid_namespace */,
+			);
+			name = "mpt";
+			path = "mpt";
+			sourceTree = "<group>";
+		};
+		1E2A22788A4209A253EF983B /* base */ = {
+			isa = PBXGroup;
+			children = (
+				CB5F32E137C5C567C09D6740 /* algorithm.hpp */,
+				31ABD04C9D3A9237A636734F /* alloc.hpp */,
+				CFA8EC5CBB3CE20424013CB9 /* arithmetic_shift.hpp */,
+				405E9187ACED5272B5E9338A /* array.hpp */,
+				224BB17F8E0FB06F5775E039 /* bit.hpp */,
+				87716DE6731AD5159CB0F094 /* check_platform.hpp */,
+				74155F7CE031516DA909BEDA /* compiletime_warning.hpp */,
+				6234A41DCEFA003A17568F9C /* constexpr_throw.hpp */,
+				5B1990F3479683367013844A /* detect.hpp */,
+				37739C93A339F9AFEC948712 /* detect_compiler.hpp */,
+				980934EB047A3664CD98B0EC /* detect_libc.hpp */,
+				4A0FB859B64A181DBF3F95AC /* detect_libcxx.hpp */,
+				4402303AB067C3C039406599 /* detect_os.hpp */,
+				DA450125468161E84F76DE77 /* detect_quirks.hpp */,
+				A3CED61B0F0A37DF18FFB36E /* floatingpoint.hpp */,
+				950801B4012364554A4574E9 /* integer.hpp */,
+				CEBD9467BA3A88AAE3B788BE /* macros.hpp */,
+				D58929FFC1DB00EFAAFA3DFF /* math.hpp */,
+				9D0B894289887C85B2057D99 /* memory.hpp */,
+				93EE5781FF53EB07882C8DE0 /* namespace.hpp */,
+				1B7BDC3F87953FE1D0B74F75 /* numeric.hpp */,
+				CBC19C5637DCFFF780FE0F8C /* pointer.hpp */,
+				3348E2A01FC6323A08BEF0D1 /* preprocessor.hpp */,
+				CFCA30133B0691D644FB0D66 /* saturate_cast.hpp */,
+				0E4DA715FAF50E45238C2AC4 /* saturate_round.hpp */,
+				E7FF40BDD37C3400FCF93414 /* secure.hpp */,
+				3BA460B82738566090FCAF14 /* semantic_version.hpp */,
+				2D78A5C5993E02E2E2999044 /* source_location.hpp */,
+				CFB31F52BB05F741A4243452 /* span.hpp */,
+				FC350F3D68EF79E7F14E94C1 /* tests */,
+				B7AE97A523C9FA466CEB0ADB /* utility.hpp */,
+				8BAE8EC4F7C8F16540EB01FA /* version.hpp */,
+				E3933AE14F5A97FD98B52560 /* wrapping_divide.hpp */,
+			);
+			name = "base";
+			path = "base";
+			sourceTree = "<group>";
+		};
+		FC350F3D68EF79E7F14E94C1 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				B5A0EB57210A81BAAA4D2F65 /* tests_base_arithmetic_shift.hpp */,
+				8F55448E7BFF799D64D081B8 /* tests_base_bit.hpp */,
+				DC33C46D481BAF635109B1DF /* tests_base_math.hpp */,
+				E793E1BDD3947538FC5CE2BC /* tests_base_saturate_cast.hpp */,
+				1DD48AA189F29E6ED2BFA480 /* tests_base_saturate_round.hpp */,
+				2B0E58AC17FAEF1B8070AF6E /* tests_base_wrapping_divide.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		C53BE9A9311FF8E93A222626 /* binary */ = {
+			isa = PBXGroup;
+			children = (
+				F0B09491DC185B5F45846F75 /* base64.hpp */,
+				A58508BF11F60A38DA1485C0 /* base64url.hpp */,
+				14649C3680F35D2189EF3E39 /* hex.hpp */,
+				CE3758AA3AFC569A03628764 /* tests */,
+			);
+			name = "binary";
+			path = "binary";
+			sourceTree = "<group>";
+		};
+		CE3758AA3AFC569A03628764 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				8BA7F3577751296760223182 /* tests_binary.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		9F15441C8B3B0E837481934E /* check */ = {
+			isa = PBXGroup;
+			children = (
+				7F168852EBA5493DF4A12A55 /* libc.hpp */,
+				3D019BE2295372D21272AFE2 /* mfc.hpp */,
+				B4E39A4BA04B611909B7752F /* windows.hpp */,
+			);
+			name = "check";
+			path = "check";
+			sourceTree = "<group>";
+		};
+		008632CAEC40227695F89AC0 /* crc */ = {
+			isa = PBXGroup;
+			children = (
+				9E7035588A57F74F33A85D6D /* crc.hpp */,
+				3C338CC3286F8F2D9181A724 /* tests */,
+			);
+			name = "crc";
+			path = "crc";
+			sourceTree = "<group>";
+		};
+		3C338CC3286F8F2D9181A724 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				AC2E9BF998D70229C16D1EA8 /* tests_crc.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		8667A838F24AB778FB4DE5B4 /* crypto */ = {
+			isa = PBXGroup;
+			children = (
+				FB92CED56703D14E30224BD7 /* exception.hpp */,
+				D277709CBEF463DFE77164F3 /* hash.hpp */,
+				FC9FF0F0682FB2DB712B93F3 /* jwk.hpp */,
+				861E2DB4F2E22BA4BB485C6E /* tests */,
+			);
+			name = "crypto";
+			path = "crypto";
+			sourceTree = "<group>";
+		};
+		861E2DB4F2E22BA4BB485C6E /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				1FDC6ACC0B86A0DBF456A8F6 /* tests_crypto.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		FF2FC9176B13D85774160694 /* detect */ = {
+			isa = PBXGroup;
+			children = (
+				BB351E1027C5DFFA30C1C012 /* mfc.hpp */,
+				7B378CD2E7FDE8EE30597751 /* nlohmann_json.hpp */,
+			);
+			name = "detect";
+			path = "detect";
+			sourceTree = "<group>";
+		};
+		3A25111FA608205FAF0B4E9B /* endian */ = {
+			isa = PBXGroup;
+			children = (
+				352D9BC9A1F3F7E5EA4E8648 /* floatingpoint.hpp */,
+				271A49A1937FDC271C587E00 /* integer.hpp */,
+				78658F09E4298EF9AD8FBEC3 /* tests */,
+			);
+			name = "endian";
+			path = "endian";
+			sourceTree = "<group>";
+		};
+		78658F09E4298EF9AD8FBEC3 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				FC15C013E8AC02C9916179C9 /* tests_endian_floatingpoint.hpp */,
+				6E4E7DA05A24049E43CE1EF1 /* tests_endian_integer.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		21F767D10DDE29C9B62E90E6 /* environment */ = {
+			isa = PBXGroup;
+			children = (
+				53F2C88C3F317308E8B34F3A /* environment.hpp */,
+			);
+			name = "environment";
+			path = "environment";
+			sourceTree = "<group>";
+		};
+		794A3DD3E5D9FEBDEED5DFD5 /* exception_text */ = {
+			isa = PBXGroup;
+			children = (
+				922031457EE0C1E9E7FDA9F4 /* exception_text.hpp */,
+			);
+			name = "exception_text";
+			path = "exception_text";
+			sourceTree = "<group>";
+		};
+		03D1CA376FE9B161389641FB /* json */ = {
+			isa = PBXGroup;
+			children = (
+				C3C5DEE1AF17B6D19836F3E1 /* json.hpp */,
+			);
+			name = "json";
+			path = "json";
+			sourceTree = "<group>";
+		};
+		DFE4D8F0CB0AA357B4502823 /* mutex */ = {
+			isa = PBXGroup;
+			children = (
+				58ECD0E74469C42A6DE6C43E /* mutex.hpp */,
+			);
+			name = "mutex";
+			path = "mutex";
+			sourceTree = "<group>";
+		};
+		74BFBCCEE0A2CB0EE9A5F94A /* osinfo */ = {
+			isa = PBXGroup;
+			children = (
+				AAA7D04116B978E89F0A0B28 /* windows_version.hpp */,
+			);
+			name = "osinfo";
+			path = "osinfo";
+			sourceTree = "<group>";
+		};
+		AD1D35B5996F0CA5828E49B5 /* out_of_memory */ = {
+			isa = PBXGroup;
+			children = (
+				D7323E80C3078633ECB6C52F /* out_of_memory.hpp */,
+			);
+			name = "out_of_memory";
+			path = "out_of_memory";
+			sourceTree = "<group>";
+		};
+		ED8B8820596F97606272C59C /* random */ = {
+			isa = PBXGroup;
+			children = (
+				3B50156AA76A780BF08C889F /* crand.hpp */,
+				70456B4FDC5613F665A8A535 /* default_engines.hpp */,
+				75746B7F61DC314DCA474663 /* device.hpp */,
+				1D18D55009809B1E72EBAF34 /* engine.hpp */,
+				54BF328A403D8323293541BB /* engine_lcg.hpp */,
+				2C0C322C1874F8F981DF0C10 /* random.hpp */,
+				85C1D6EE713ECA319ABBCA45 /* seed.hpp */,
+				838EBBB1EF52BAA1B8B8EA6B /* tests */,
+			);
+			name = "random";
+			path = "random";
+			sourceTree = "<group>";
+		};
+		838EBBB1EF52BAA1B8B8EA6B /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				BC8A232EA834593D91056158 /* tests_random.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		9A9F4703068356430F86847F /* string */ = {
+			isa = PBXGroup;
+			children = (
+				7A52207166BAE63ECF25FB54 /* buffer.hpp */,
+				A3456BE00FABFE669883A03F /* convert.hpp */,
+				E0B2BE69CC46B411350B0EC6 /* convert_macros.hpp */,
+				07E8B2CAF3E846451CB1B3C9 /* format_default_floatingpoint.hpp */,
+				BFA4F3FEAB0FB40A542B1970 /* format_default_formatter.hpp */,
+				3B1EEA7627DE7A1B90FB6226 /* format_default_integer.hpp */,
+				C6CED4E1324117FE7BD54C82 /* format_default_string.hpp */,
+				B7F87AEDA38C70950C51CA49 /* format_helpers.hpp */,
+				EBA6A29AD73A984240FFF1F6 /* format_message.hpp */,
+				518D2BEABDFF6D060694A38A /* format_message_macros.hpp */,
+				D401362840C89244892321A7 /* format_simple.hpp */,
+				B3F311931F877341286EE3F7 /* format_simple_floatingpoint.hpp */,
+				5C6529F6C8D76B12116CA196 /* format_simple_integer.hpp */,
+				BBA6103AA750464990214E64 /* format_simple_spec.hpp */,
+				DCBCA73148D70AD391F91A67 /* parse.hpp */,
+				2097B90E8C5BB8FE55C1E8C8 /* tests */,
+				5CBE19A3C8D87C4411FB8CD8 /* types.hpp */,
+				9446926E00AC25F58984C7CD /* utility.hpp */,
+			);
+			name = "string";
+			path = "string";
+			sourceTree = "<group>";
+		};
+		2097B90E8C5BB8FE55C1E8C8 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				C8173AC334E00747FD701059 /* tests_string_buffer.hpp */,
+				7149BE485D1F454646C95F99 /* tests_string_convert.hpp */,
+				B628FCAC229D910AEBE6DE19 /* tests_string_format_message.hpp */,
+				3D7A5A4A29119DFFD2C51300 /* tests_string_format_simple.hpp */,
+				0853BBE0F4BD7BEC9DD9E051 /* tests_string_parse.hpp */,
+				23D7596A0FADE067F856FBBA /* tests_string_utility.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		D440C35E4005C24E096BF218 /* system_error */ = {
+			isa = PBXGroup;
+			children = (
+				28F7ADCD14A1E3DCFD71EBF7 /* system_error.hpp */,
+			);
+			name = "system_error";
+			path = "system_error";
+			sourceTree = "<group>";
+		};
+		89AE0F0DF5C6F636BE7386D0 /* test */ = {
+			isa = PBXGroup;
+			children = (
+				8FE69E037B3876F36457B303 /* test.hpp */,
+				7599632DE10966A6AA28E02E /* test_macros.hpp */,
+			);
+			name = "test";
+			path = "test";
+			sourceTree = "<group>";
+		};
+		1C85FA62889DE18C514A7126 /* uuid */ = {
+			isa = PBXGroup;
+			children = (
+				EB79DE7AD7CBB56AC0EAF27A /* guid.hpp */,
+				218629608D3F940A169FAEE4 /* tests */,
+				FE462636EA98FD25D3B73A36 /* uuid.hpp */,
+			);
+			name = "uuid";
+			path = "uuid";
+			sourceTree = "<group>";
+		};
+		218629608D3F940A169FAEE4 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				708D205D5C211605C5E56FB9 /* tests_uuid.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		709C11C4DC2BD3AEE527B4C6 /* uuid_namespace */ = {
+			isa = PBXGroup;
+			children = (
+				AAA9EFDC161AF255DF386CDE /* tests */,
+				336CABEC1F2C3C918849249C /* uuid_namespace.hpp */,
+			);
+			name = "uuid_namespace";
+			path = "uuid_namespace";
+			sourceTree = "<group>";
+		};
+		AAA9EFDC161AF255DF386CDE /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				254477ED1146BBFDFAC8B1F6 /* tests_uuid_namespace.hpp */,
+			);
+			name = "tests";
+			path = "tests";
+			sourceTree = "<group>";
+		};
+		E76F6E305332A2BA9CE23047 /* Products */ = {
+			isa = PBXGroup;
+			children = (
 				C1F3343CADAE24E856669D32 /* liblibopenmpt.dylib */,
 			);
 			name = "Products";
 			sourceTree = "<group>";
 		};
-		B533D44521F607D06AA6965C /* Projects */ = {
+		FE383F6E6AFB72F8B3AB0185 /* Projects */ = {
 			isa = PBXGroup;
 			children = (
 				8CACB699F8BD5E40810FF17F /* mpg123.xcodeproj */,
@@ -1009,11 +1585,11 @@
 /* Begin PBXNativeTarget section */
 		87EFAFF2F3FCDDD87CE3D9C3 /* libopenmpt */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 3E76E37EAA40B5D9F346B4FE /* Build configuration list for PBXNativeTarget "libopenmpt" */;
+			buildConfigurationList = 87D1DC6BF39BAEC63CA2ADEB /* Build configuration list for PBXNativeTarget "libopenmpt" */;
 			buildPhases = (
-				60F9DCBFCCC3AE1A15CAAD3F /* Resources */,
-				9842D600040DA85B4D13A780 /* Sources */,
-				824FCF41EE19A19C3720A0C1 /* Frameworks */,
+				A954D6AC151FA8075E25A72C /* Resources */,
+				E19DCFED4D68A148966EA06D /* Sources */,
+				82B82D05EE82FF5F3789FE84 /* Frameworks */,
 			);
 			buildRules = (
 			);
@@ -1083,7 +1659,7 @@
 /* End PBXReferenceProxy section */
 
 /* Begin PBXResourcesBuildPhase section */
-		60F9DCBFCCC3AE1A15CAAD3F /* Resources */ = {
+		A954D6AC151FA8075E25A72C /* Resources */ = {
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -1093,7 +1669,7 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXSourcesBuildPhase section */
-		9842D600040DA85B4D13A780 /* Sources */ = {
+		E19DCFED4D68A148966EA06D /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -1310,6 +1886,17 @@
 				COPY_PHASE_STRIP = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
+				EXCLUDED_SOURCE_FILE_NAMES = (
+					"*/src/mpt/crypto/exception.hpp",
+					"*/src/mpt/crypto/hash.hpp",
+					"*/src/mpt/crypto/jwk.hpp",
+					"*/src/mpt/crypto/tests/tests_crypto.hpp",
+					"*/src/mpt/json/json.hpp",
+					"*/src/mpt/test/test.hpp",
+					"*/src/mpt/test/test_macros.hpp",
+					"*/src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp",
+					"*/src/mpt/uuid_namespace/uuid_namespace.hpp",
+				);
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_ENABLE_FIX_AND_CONTINUE = YES;
 				GCC_NO_COMMON_BLOCKS = YES;
@@ -1334,6 +1921,7 @@
 					../../include/ogg/include,
 					../../include/vorbis/include,
 					../..,
+					../../src,
 					../../common,
 					../../soundlib,
 					"$(IntDir)/svn_version",
@@ -1371,6 +1959,17 @@
 				CONFIGURATION_TEMP_DIR = "$(OBJROOT)";
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
+				EXCLUDED_SOURCE_FILE_NAMES = (
+					"*/src/mpt/crypto/exception.hpp",
+					"*/src/mpt/crypto/hash.hpp",
+					"*/src/mpt/crypto/jwk.hpp",
+					"*/src/mpt/crypto/tests/tests_crypto.hpp",
+					"*/src/mpt/json/json.hpp",
+					"*/src/mpt/test/test.hpp",
+					"*/src/mpt/test/test_macros.hpp",
+					"*/src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp",
+					"*/src/mpt/uuid_namespace/uuid_namespace.hpp",
+				);
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_NO_COMMON_BLOCKS = YES;
 				GCC_OPTIMIZATION_LEVEL = 3;
@@ -1393,6 +1992,7 @@
 					../../include/ogg/include,
 					../../include/vorbis/include,
 					../..,
+					../../src,
 					../../common,
 					../../soundlib,
 					"$(IntDir)/svn_version",
@@ -1417,7 +2017,7 @@
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
-		3E76E37EAA40B5D9F346B4FE /* Build configuration list for PBXNativeTarget "liblibopenmpt.dylib" */ = {
+		87D1DC6BF39BAEC63CA2ADEB /* Build configuration list for PBXNativeTarget "liblibopenmpt.dylib" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				09B8609D754722887E4303A0 /* Debug */,
Index: common/BuildSettings.h
===================================================================
--- common/BuildSettings.h	(revision 14628)
+++ common/BuildSettings.h	(working copy)
@@ -40,8 +40,10 @@
 #error "either MODPLUG_TRACKER or LIBOPENMPT_BUILD has to be defined"
 #elif defined(MODPLUG_TRACKER)
 // nothing
+#define MPT_INLINE_NS mptx
 #elif defined(LIBOPENMPT_BUILD)
 // nothing
+#define MPT_INLINE_NS mpt_libopenmpt
 #else
 #error "either MODPLUG_TRACKER or LIBOPENMPT_BUILD has to be defined"
 #endif // MODPLUG_TRACKER || LIBOPENMPT_BUILD
@@ -338,10 +340,6 @@
 
 #elif MPT_OS_DJGPP
 
-	#ifndef MPT_LOCALE_ASSUME_CHARSET
-	#define MPT_LOCALE_ASSUME_CHARSET DJGPP_GetLocaleCharset()
-	#endif
-
 #endif
 
 
@@ -350,17 +348,17 @@
 
 	// Use wide strings for MSVC because this is the native encoding on 
 	// microsoft platforms.
-	#define MPT_USTRING_MODE_WIDE 1
-	#define MPT_USTRING_MODE_UTF8 0
+	#define MPT_USTRING_MODE_WIDE_OLD 1
+	#define MPT_USTRING_MODE_UTF8_OLD 0
 
 #else // !MPT_COMPILER_MSVC
 
-	#define MPT_USTRING_MODE_WIDE 0
-	#define MPT_USTRING_MODE_UTF8 1
+	#define MPT_USTRING_MODE_WIDE_OLD 0
+	#define MPT_USTRING_MODE_UTF8_OLD 1
 
 #endif // MPT_COMPILER_MSVC
 
-#if defined(MODPLUG_TRACKER) || MPT_USTRING_MODE_WIDE
+#if defined(MODPLUG_TRACKER) || MPT_USTRING_MODE_WIDE_OLD
 
 	// mpt::ToWString, mpt::wfmt, ConvertStrTo<std::wstring>
 	// Required by the tracker to ease interfacing with WinAPI.
@@ -373,7 +371,7 @@
 
 #endif
 
-#if MPT_OS_WINDOWS || MPT_USTRING_MODE_WIDE || MPT_WSTRING_FORMAT
+#if MPT_OS_WINDOWS || MPT_USTRING_MODE_WIDE_OLD || MPT_WSTRING_FORMAT
 
 	// mpt::ToWide
 	// Required on Windows by mpt::PathString.
@@ -554,6 +552,14 @@
 #define OPENMPT_NAMESPACE_END   }
 #endif
 
+namespace mpt {
+} // namespace mpt
+OPENMPT_NAMESPACE_BEGIN
+namespace mpt {
+using namespace ::mpt;
+} // namespace mpt
+OPENMPT_NAMESPACE_END
+
 #endif
 
 
@@ -621,6 +627,7 @@
 #endif
 
 #define __STDC_CONSTANT_MACROS
+#define __STDC_FORMAT_MACROS
 #define __STDC_LIMIT_MACROS
 
 #define _USE_MATH_DEFINES
@@ -687,6 +694,12 @@
 
 // third-party library configuration
 
+#if MPT_OS_WINDOWS
+#ifndef UNICODE
+#define MPT_CHECK_WINDOWS_IGNORE_WARNING_NO_UNICODE
+#endif // !UNICODE
+#endif // MPT_OS_WINDOWS
+
 #ifdef MPT_WITH_FLAC
 #ifdef MPT_BUILD_MSVC_STATIC
 #define FLAC__NO_DLL
@@ -721,3 +734,22 @@
 #endif
 #endif
 
+
+
+#ifdef __cplusplus
+
+#include "mpt/base/namespace.hpp"
+
+OPENMPT_NAMESPACE_BEGIN
+
+namespace mpt {
+
+#ifndef MPT_NO_NAMESPACE
+using namespace ::mpt;
+#endif
+
+} // namespace mpt
+
+OPENMPT_NAMESPACE_END
+
+#endif
Index: common/CompilerDetect.h
===================================================================
--- common/CompilerDetect.h	(revision 14628)
+++ common/CompilerDetect.h	(working copy)
@@ -7,367 +7,8 @@
  * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
  */
 
-
 #pragma once
 
-
-
-#define MPT_COMPILER_MAKE_VERSION2(version,sp)              ((version) * 100 + (sp))
-#define MPT_COMPILER_MAKE_VERSION3(major,minor,patch)       ((major) * 10000 + (minor) * 100 + (patch))
-#define MPT_COMPILER_MAKE_VERSION3_BUILD(major,minor,build) ((major) * 10000000 + (minor) * 100000 + (patch))
-
-
-
-#if defined(MPT_COMPILER_GENERIC)
-
-#undef MPT_COMPILER_GENERIC
-#define MPT_COMPILER_GENERIC                         1
-
-#elif defined(__clang__) && defined(_MSC_VER) && defined(__c2__)
-
-#error "Clang/C2 is not supported. Please use Clang/LLVM for Windows instead."
-
-#elif defined(__clang__)
-
-#define MPT_COMPILER_CLANG                           1
-#define MPT_COMPILER_CLANG_VERSION                   MPT_COMPILER_MAKE_VERSION3(__clang_major__,__clang_minor__,__clang_patchlevel__)
-#define MPT_CLANG_AT_LEAST(major,minor,patch)        (MPT_COMPILER_CLANG_VERSION >= MPT_COMPILER_MAKE_VERSION3((major),(minor),(patch)))
-#define MPT_CLANG_BEFORE(major,minor,patch)          (MPT_COMPILER_CLANG_VERSION <  MPT_COMPILER_MAKE_VERSION3((major),(minor),(patch)))
-
-#if MPT_CLANG_BEFORE(7,0,0)
-#error "clang version 7 required"
-#endif
-
-#if defined(__clang_analyzer__)
-#ifndef MPT_BUILD_ANALYZED
-#define MPT_BUILD_ANALYZED
-#endif
-#endif
-
-#elif defined(__GNUC__)
-
-#define MPT_COMPILER_GCC                             1
-#define MPT_COMPILER_GCC_VERSION                     MPT_COMPILER_MAKE_VERSION3(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__)
-#define MPT_GCC_AT_LEAST(major,minor,patch)          (MPT_COMPILER_GCC_VERSION >= MPT_COMPILER_MAKE_VERSION3((major),(minor),(patch)))
-#define MPT_GCC_BEFORE(major,minor,patch)            (MPT_COMPILER_GCC_VERSION <  MPT_COMPILER_MAKE_VERSION3((major),(minor),(patch)))
-
-#if MPT_GCC_BEFORE(8,1,0)
-#error "GCC version 8.1 required"
-#endif
-
-#elif defined(_MSC_VER)
-
-#define MPT_COMPILER_MSVC                            1
-#if (_MSC_VER >= 1926)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2019,6)
-#elif (_MSC_VER >= 1925)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2019,5)
-#elif (_MSC_VER >= 1924)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2019,4)
-#elif (_MSC_VER >= 1923)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2019,3)
-#elif (_MSC_VER >= 1922)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2019,2)
-#elif (_MSC_VER >= 1921)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2019,1)
-#elif (_MSC_VER >= 1920)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2019,0)
-#elif (_MSC_VER >= 1916)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2017,9)
-#elif (_MSC_VER >= 1915)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2017,8)
-#elif (_MSC_VER >= 1914)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2017,7)
-#elif (_MSC_VER >= 1913)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2017,6)
-#elif (_MSC_VER >= 1912)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2017,5)
-#elif (_MSC_VER >= 1911)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2017,3)
-#elif (_MSC_VER >= 1910)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2017,0)
-#elif (_MSC_VER >= 1900) && defined(_MSVC_LANG)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2015,3)
-#elif (_MSC_VER >= 1900)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2015,0)
-#elif (_MSC_VER >= 1800)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2013,0)
-#elif (_MSC_VER >= 1700)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2012,0)
-#elif (_MSC_VER >= 1600)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2010,0)
-#elif (_MSC_VER >= 1500)
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2008,0)
-#else
-#define MPT_COMPILER_MSVC_VERSION                    MPT_COMPILER_MAKE_VERSION2(2005,0)
-#endif
-#define MPT_MSVC_AT_LEAST(version,sp)                (MPT_COMPILER_MSVC_VERSION >= MPT_COMPILER_MAKE_VERSION2((version),(sp)))
-#define MPT_MSVC_BEFORE(version,sp)                  (MPT_COMPILER_MSVC_VERSION <  MPT_COMPILER_MAKE_VERSION2((version),(sp)))
-
-#if MPT_MSVC_BEFORE(2017,9)
-#error "MSVC version 2017 15.9 required"
-#endif
-
-#if defined(_PREFAST_)
-#ifndef MPT_BUILD_ANALYZED
-#define MPT_BUILD_ANALYZED
-#endif
-#endif
-
-#else
-
-#define MPT_COMPILER_GENERIC                         1
-
-#endif
-
-
-
-#ifndef MPT_COMPILER_GENERIC
-#define MPT_COMPILER_GENERIC                  0
-#endif
-#ifndef MPT_COMPILER_CLANG
-#define MPT_COMPILER_CLANG                    0
-#define MPT_CLANG_AT_LEAST(major,minor,patch) 0
-#define MPT_CLANG_BEFORE(major,minor,patch)   0
-#endif
-#ifndef MPT_COMPILER_GCC
-#define MPT_COMPILER_GCC                      0
-#define MPT_GCC_AT_LEAST(major,minor,patch)   0
-#define MPT_GCC_BEFORE(major,minor,patch)     0
-#endif
-#ifndef MPT_COMPILER_MSVC
-#define MPT_COMPILER_MSVC                     0
-#define MPT_MSVC_AT_LEAST(version,sp)         0
-#define MPT_MSVC_BEFORE(version,sp)           0
-#endif
-
-
-
-#if MPT_COMPILER_GENERIC || MPT_COMPILER_GCC || MPT_COMPILER_CLANG
-
-#if (__cplusplus >= 201703)
-#define MPT_CXX 17
-#else
-#define MPT_CXX 17
-#endif
-
-#elif MPT_COMPILER_MSVC
-
-#if (_MSVC_LANG >= 201703)
-#define MPT_CXX 17
-#else
-#define MPT_CXX 17
-#endif
-
-#else
-
-#define MPT_CXX 17
-
-#endif
-
-// MPT_CXX is stricter than just using __cplusplus directly.
-// We will only claim a language version as supported IFF all core language and
-// library fatures that we need are actually supported AND working correctly
-// (to our needs).
-
-#define MPT_CXX_AT_LEAST(version) (MPT_CXX >= (version))
-#define MPT_CXX_BEFORE(version)   (MPT_CXX <  (version))
-
-
-
-// This should really be based on __STDCPP_THREADS__, but that is not defined by
-// GCC or clang. Stupid.
-// Just assume multithreaded and disable for platforms we know are
-// singlethreaded later on.
-#define MPT_PLATFORM_MULTITHREADED 1
-
-
-
-// specific C++ features
-
-
-
-#if MPT_COMPILER_MSVC
-// Compiler has multiplication/division semantics when shifting signed integers.
-#define MPT_COMPILER_SHIFT_SIGNED 1
-#endif
-
-#ifndef MPT_COMPILER_SHIFT_SIGNED
-#define MPT_COMPILER_SHIFT_SIGNED 0
-#endif
-
-
-
-// The order of the checks matters!
-#if defined(__DJGPP__)
-	#define MPT_OS_DJGPP 1
-#elif defined(__EMSCRIPTEN__)
-	#define MPT_OS_EMSCRIPTEN 1
-	#if defined(__EMSCRIPTEN_major__) && defined(__EMSCRIPTEN_minor__)
-		#if (__EMSCRIPTEN_major__ > 1)
-			// ok
-		#elif (__EMSCRIPTEN_major__ == 1) && (__EMSCRIPTEN_minor__ > 39)
-			// ok
-		#elif (__EMSCRIPTEN_major__ == 1) && (__EMSCRIPTEN_minor__ == 39) && (__EMSCRIPTEN_tiny__ >= 7)
-			// ok
-		#else
-			#error "Emscripten >= 1.39.7 is required."
-		#endif
-	#endif
-#elif defined(_WIN32)
-	#define MPT_OS_WINDOWS 1
-	#if defined(WINAPI_FAMILY)
-		#include <winapifamily.h>
-		#if (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
-			#define MPT_OS_WINDOWS_WINRT 0
-		#else
-			#define MPT_OS_WINDOWS_WINRT 1
-		#endif
-	#else // !WINAPI_FAMILY
-		#define MPT_OS_WINDOWS_WINRT 0
-	#endif // WINAPI_FAMILY
-#elif defined(__APPLE__)
-	#define MPT_OS_MACOSX_OR_IOS 1
-	//#include "TargetConditionals.h"
-	//#if TARGET_IPHONE_SIMULATOR
-	//#elif TARGET_OS_IPHONE
-	//#elif TARGET_OS_MAC
-	//#else
-	//#endif
-#elif defined(__HAIKU__)
-	#define MPT_OS_HAIKU 1
-#elif defined(__ANDROID__) || defined(ANDROID)
-	#define MPT_OS_ANDROID 1
-#elif defined(__linux__)
-	#define MPT_OS_LINUX 1
-#elif defined(__DragonFly__)
-	#define MPT_OS_DRAGONFLYBSD 1
-#elif defined(__FreeBSD__)
-	#define MPT_OS_FREEBSD 1
-#elif defined(__OpenBSD__)
-	#define MPT_OS_OPENBSD 1
-#elif defined(__NetBSD__)
-	#define MPT_OS_NETBSD 1
-#elif defined(__unix__)
-	#define MPT_OS_GENERIC_UNIX 1
-#else
-	#define MPT_OS_UNKNOWN 1
-#endif
-
-#ifndef MPT_OS_DJGPP
-#define MPT_OS_DJGPP 0
-#endif
-#ifndef MPT_OS_EMSCRIPTEN
-#define MPT_OS_EMSCRIPTEN 0
-#endif
-#ifndef MPT_OS_WINDOWS
-#define MPT_OS_WINDOWS 0
-#endif
-#ifndef MPT_OS_WINDOWS_WINRT
-#define MPT_OS_WINDOWS_WINRT 0
-#endif
-#ifndef MPT_OS_MACOSX_OR_IOS
-#define MPT_OS_MACOSX_OR_IOS 0
-#endif
-#ifndef MPT_OS_HAIKU
-#define MPT_OS_HAIKU 0
-#endif
-#ifndef MPT_OS_ANDROID
-#define MPT_OS_ANDROID 0
-#endif
-#ifndef MPT_OS_LINUX
-#define MPT_OS_LINUX 0
-#endif
-#ifndef MPT_OS_DRAGONFLYBSD
-#define MPT_OS_DRAGONFLYBSD 0
-#endif
-#ifndef MPT_OS_FREEBSD
-#define MPT_OS_FREEBSD 0
-#endif
-#ifndef MPT_OS_OPENBSD
-#define MPT_OS_OPENBSD 0
-#endif
-#ifndef MPT_OS_NETBSD
-#define MPT_OS_NETBSD 0
-#endif
-#ifndef MPT_OS_GENERIC_UNIX
-#define MPT_OS_GENERIC_UNIX 0
-#endif
-#ifndef MPT_OS_UNKNOWN
-#define MPT_OS_UNKNOWN 0
-#endif
-
-
-
-#if MPT_OS_DJGPP
-#undef MPT_PLATFORM_MULTITHREADED
-#define MPT_PLATFORM_MULTITHREADED 0
-#endif
-
-#if (MPT_OS_EMSCRIPTEN && !defined(__EMSCRIPTEN_PTHREADS__))
-#undef MPT_PLATFORM_MULTITHREADED
-#define MPT_PLATFORM_MULTITHREADED 0
-#endif
-
-
-#if MPT_OS_EMSCRIPTEN && defined(MPT_BUILD_AUDIOWORKLETPROCESSOR)
-#define MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK
-#define MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
-#endif
-
-
-#if MPT_OS_DJGPP
-#define MPT_COMPILER_QUIRK_NO_WCHAR
-#endif
-
-
-#if defined(__arm__)
-
-#if defined(__SOFTFP__)
-#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 1
-#else
-#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
-#endif
-#if defined(__VFP_FP__)
-// native-endian IEEE754
-#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 0
-#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754 0
-#elif defined(__MAVERICK__)
-// little-endian IEEE754, we assume native-endian though
-#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 1
-#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754 0
-#else
-// not IEEE754
-#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 1
-#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754 1
-#endif
-
-#elif defined(__mips__)
-
-#if defined(__mips_soft_float)
-#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 1
-#else
-#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
-#endif
-
-#endif
-
-#if MPT_OS_EMSCRIPTEN
-#define MPT_COMPILER_QUIRK_FLOAT_PREFER64 1
-#endif
-
-#ifndef MPT_COMPILER_QUIRK_FLOAT_PREFER32
-#define MPT_COMPILER_QUIRK_FLOAT_PREFER32 0
-#endif
-#ifndef MPT_COMPILER_QUIRK_FLOAT_PREFER64
-#define MPT_COMPILER_QUIRK_FLOAT_PREFER64 0
-#endif
-#ifndef MPT_COMPILER_QUIRK_FLOAT_EMULATED
-#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
-#endif
-#ifndef MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN
-#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 0
-#endif
-#ifndef MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754
-#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754 0
-#endif
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
Index: common/Endianness.h
===================================================================
--- common/Endianness.h	(revision 14628)
+++ common/Endianness.h	(working copy)
@@ -12,203 +12,60 @@
 
 #include "BuildSettings.h"
 
-#include <array>
-#if MPT_CXX_AT_LEAST(20)
-#include <bit>
-#endif // C++20
-#include <limits>
+#include "mpt/base/bit.hpp"
+#include "mpt/endian/floatingpoint.hpp"
+#include "mpt/endian/integer.hpp"
 
-#include <cmath>
-#include <cstdlib>
+#include <algorithm>
 
-#include <math.h>
-#include <stdlib.h>
 
-#if MPT_COMPILER_MSVC
-#include <intrin.h>
-#endif
 
-
-
 OPENMPT_NAMESPACE_BEGIN
 
 
 
-namespace mpt {
+using  int64le = mpt::packed< int64, mpt::LittleEndian_tag>;
+using  int32le = mpt::packed< int32, mpt::LittleEndian_tag>;
+using  int16le = mpt::packed< int16, mpt::LittleEndian_tag>;
+using   int8le = mpt::packed< int8 , mpt::LittleEndian_tag>;
+using uint64le = mpt::packed<uint64, mpt::LittleEndian_tag>;
+using uint32le = mpt::packed<uint32, mpt::LittleEndian_tag>;
+using uint16le = mpt::packed<uint16, mpt::LittleEndian_tag>;
+using  uint8le = mpt::packed<uint8 , mpt::LittleEndian_tag>;
 
+using  int64be = mpt::packed< int64, mpt::BigEndian_tag>;
+using  int32be = mpt::packed< int32, mpt::BigEndian_tag>;
+using  int16be = mpt::packed< int16, mpt::BigEndian_tag>;
+using   int8be = mpt::packed< int8 , mpt::BigEndian_tag>;
+using uint64be = mpt::packed<uint64, mpt::BigEndian_tag>;
+using uint32be = mpt::packed<uint32, mpt::BigEndian_tag>;
+using uint16be = mpt::packed<uint16, mpt::BigEndian_tag>;
+using  uint8be = mpt::packed<uint8 , mpt::BigEndian_tag>;
 
 
-#if MPT_CXX_AT_LEAST(20)
 
-using std::endian;
+using IEEE754binary32LE = mpt::IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32LE;
+using IEEE754binary32BE = mpt::IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32BE;
+using IEEE754binary64LE = mpt::IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64LE;
+using IEEE754binary64BE = mpt::IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64BE;
 
-static_assert(mpt::endian::big != mpt::endian::little, "platform with all scalar types having size 1 is not supported");
 
-constexpr mpt::endian get_endian() noexcept
-{
-	return mpt::endian::native;
-}
+// unaligned
 
-constexpr bool endian_is_little() noexcept
-{
-	return get_endian() == mpt::endian::little;
-}
+using float32le = mpt::IEEE754binary32EmulatedLE;
+using float32be = mpt::IEEE754binary32EmulatedBE;
+using float64le = mpt::IEEE754binary64EmulatedLE;
+using float64be = mpt::IEEE754binary64EmulatedBE;
 
-constexpr bool endian_is_big() noexcept
-{
-	return get_endian() == mpt::endian::big;
-}
 
-constexpr bool endian_is_weird() noexcept
-{
-	return !endian_is_little() && !endian_is_big();
-}
+// potentially aligned
 
-#else // !C++20
+using float32le_fast = mpt::IEEE754binary32LE;
+using float32be_fast = mpt::IEEE754binary32BE;
+using float64le_fast = mpt::IEEE754binary64LE;
+using float64be_fast = mpt::IEEE754binary64BE;
 
-#if !MPT_COMPILER_GENERIC
 
-#if MPT_COMPILER_MSVC
-	#define MPT_PLATFORM_LITTLE_ENDIAN
-#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
-	#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-		#define MPT_PLATFORM_BIG_ENDIAN
-	#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-		#define MPT_PLATFORM_LITTLE_ENDIAN
-	#endif
-#endif
-
-// fallback:
-#if !defined(MPT_PLATFORM_BIG_ENDIAN) && !defined(MPT_PLATFORM_LITTLE_ENDIAN)
-	// taken from boost/detail/endian.hpp
-	#if (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) \
-		|| (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) \
-		|| (defined(_STLP_BIG_ENDIAN) && !defined(_STLP_LITTLE_ENDIAN))
-			#define MPT_PLATFORM_BIG_ENDIAN
-	#elif (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) \
-		|| (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) \
-		|| (defined(_STLP_LITTLE_ENDIAN) && !defined(_STLP_BIG_ENDIAN))
-			#define MPT_PLATFORM_LITTLE_ENDIAN
-	#elif defined(__sparc) || defined(__sparc__) \
-		|| defined(_POWER) || defined(__powerpc__) \
-		|| defined(__ppc__) || defined(__hpux) || defined(__hppa) \
-		|| defined(_MIPSEB) || defined(_POWER) \
-		|| defined(__s390__)
-			#define MPT_PLATFORM_BIG_ENDIAN
-	#elif defined(__i386__) || defined(__alpha__) \
-		|| defined(__ia64) || defined(__ia64__) \
-		|| defined(_M_IX86) || defined(_M_IA64) \
-		|| defined(_M_ALPHA) || defined(__amd64) \
-		|| defined(__amd64__) || defined(_M_AMD64) \
-		|| defined(__x86_64) || defined(__x86_64__) \
-		|| defined(_M_X64) || defined(__bfin__)
-			#define MPT_PLATFORM_LITTLE_ENDIAN
-	#endif
-#endif
-
-#endif // !MPT_COMPILER_GENERIC
-
-enum class endian
-{
-	little = 0x78563412u,
-	big    = 0x12345678u,
-	weird  = 1u,
-#if MPT_COMPILER_GENERIC
-	native = 0u,
-#elif defined(MPT_PLATFORM_LITTLE_ENDIAN)
-	native = little,
-#elif defined(MPT_PLATFORM_BIG_ENDIAN)
-	native = big,
-#else
-	native = 0u,
-#endif
-};
-
-static_assert(mpt::endian::big != mpt::endian::little, "platform with all scalar types having size 1 is not supported");
-
-namespace detail {
-
-	MPT_FORCEINLINE mpt::endian endian_probe() noexcept
-	{
-		using endian_probe_type = uint32;
-		static_assert(sizeof(endian_probe_type) == 4);
-		constexpr endian_probe_type endian_probe_big    = 0x12345678u;
-		constexpr endian_probe_type endian_probe_little = 0x78563412u;
-		const std::array<std::byte, sizeof(endian_probe_type)> probe{ {mpt::as_byte(0x12), mpt::as_byte(0x34), mpt::as_byte(0x56), mpt::as_byte(0x78)} };
-		const endian_probe_type test = mpt::bit_cast<endian_probe_type>(probe);
-		mpt::endian result = mpt::endian::native;
-		switch(test)
-		{
-			case endian_probe_big:
-				result = mpt::endian::big;
-				break;
-			case endian_probe_little:
-				result = mpt::endian::little;
-				break;
-			default:
-				result = mpt::endian::weird;
-				break;
-		}
-		return result;
-	}
-
-} // namespace detail
-
-MPT_FORCEINLINE mpt::endian get_endian() noexcept
-{
-#if MPT_COMPILER_MSVC
-#pragma warning(push)
-#pragma warning(disable:6285) // false-positive: (<non-zero constant> || <non-zero constant>) is always a non-zero constant.
-#endif // MPT_COMPILER_MSVC
-	if constexpr((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big))
-	{
-		return mpt::endian::native;
-	} else
-	{
-		return detail::endian_probe();
-	}
-#if MPT_COMPILER_MSVC
-#pragma warning(pop)
-#endif // MPT_COMPILER_MSVC
-}
-
-MPT_FORCEINLINE bool endian_is_little() noexcept
-{
-	return get_endian() == mpt::endian::little;
-}
-
-MPT_FORCEINLINE bool endian_is_big() noexcept
-{
-	return get_endian() == mpt::endian::big;
-}
-
-MPT_FORCEINLINE bool endian_is_weird() noexcept
-{
-	return !endian_is_little() && !endian_is_big();
-}
-
-#endif // C++20
-
-
-
-} // namespace mpt
-
-
-
-struct BigEndian_tag
-{
-	static constexpr mpt::endian endian = mpt::endian::big;
-};
-
-struct LittleEndian_tag
-{
-	static constexpr mpt::endian endian = mpt::endian::little;
-};
-
-
-
-namespace mpt {
-
 template <typename Tbyte>
 inline void SwapBufferEndian(std::size_t elementSize, Tbyte * buffer, std::size_t elements)
 {
@@ -220,837 +77,8 @@
 	}
 }
 
-} // namespace mpt
 
 
-
-namespace mpt {
-namespace detail {
-constexpr inline uint16 constexpr_bswap16(uint16 x) noexcept
-{
-	return uint16(0)
-		| ((x >> 8) & 0x00FFu)
-		| ((x << 8) & 0xFF00u)
-		;
-}
-constexpr inline uint32 constexpr_bswap32(uint32 x) noexcept
-{
-	return uint32(0)
-		| ((x & 0x000000FFu) << 24)
-		| ((x & 0x0000FF00u) <<  8)
-		| ((x & 0x00FF0000u) >>  8)
-		| ((x & 0xFF000000u) >> 24)
-		;
-}
-constexpr inline uint64 constexpr_bswap64(uint64 x) noexcept
-{
-	return uint64(0)
-		| (((x >>  0) & 0xffull) << 56)
-		| (((x >>  8) & 0xffull) << 48)
-		| (((x >> 16) & 0xffull) << 40)
-		| (((x >> 24) & 0xffull) << 32)
-		| (((x >> 32) & 0xffull) << 24)
-		| (((x >> 40) & 0xffull) << 16)
-		| (((x >> 48) & 0xffull) <<  8)
-		| (((x >> 56) & 0xffull) <<  0)
-		;
-}
-} // namespace detail
-} // namespace mpt
-
-#if MPT_COMPILER_GCC
-#define MPT_bswap16 __builtin_bswap16
-#define MPT_bswap32 __builtin_bswap32
-#define MPT_bswap64 __builtin_bswap64
-#elif MPT_COMPILER_MSVC
-#define MPT_bswap16 _byteswap_ushort
-#define MPT_bswap32 _byteswap_ulong
-#define MPT_bswap64 _byteswap_uint64
-#endif
-
-namespace mpt { namespace detail {
-// catch system macros
-#ifndef MPT_bswap16
-#ifdef bswap16
-MPT_FORCEINLINE uint16 mpt_bswap16(uint16 x) { return bswap16(x); }
-#define MPT_bswap16 mpt::detail::mpt_bswap16
-#endif
-#endif
-#ifndef MPT_bswap32
-#ifdef bswap32
-MPT_FORCEINLINE uint32 mpt_bswap32(uint32 x) { return bswap32(x); }
-#define MPT_bswap32 mpt::detail::mpt_bswap32
-#endif
-#endif
-#ifndef MPT_bswap64
-#ifdef bswap64
-MPT_FORCEINLINE uint64 mpt_bswap64(uint64 x) { return bswap64(x); }
-#define MPT_bswap64 mpt::detail::mpt_bswap64
-#endif
-#endif
-} } // namespace mpt::detail
-
-// No intrinsics available
-#ifndef MPT_bswap16
-#define MPT_bswap16(x) mpt::detail::constexpr_bswap16(x)
-#endif
-#ifndef MPT_bswap32
-#define MPT_bswap32(x) mpt::detail::constexpr_bswap32(x)
-#endif
-#ifndef MPT_bswap64
-#define MPT_bswap64(x) mpt::detail::constexpr_bswap64(x)
-#endif
-
-
-
-template <typename T, typename Tendian, std::size_t size>
-MPT_CONSTEXPRINLINE std::array<std::byte, size> EndianEncode(T val) noexcept
-{
-	static_assert(Tendian::endian == mpt::endian::little || Tendian::endian == mpt::endian::big);
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(!std::numeric_limits<T>::is_signed);
-	static_assert(sizeof(T) == size);
-	using base_type = T;
-	using unsigned_base_type = typename std::make_unsigned<base_type>::type;
-	using endian_type = Tendian;
-	unsigned_base_type uval = static_cast<unsigned_base_type>(val);
-	std::array<std::byte, size> data{};
-	if constexpr(endian_type::endian == mpt::endian::little)
-	{
-		for(std::size_t i = 0; i < sizeof(base_type); ++i)
-		{
-			data[i] = static_cast<std::byte>(static_cast<uint8>((uval >> (i*8)) & 0xffu));
-		}
-	} else
-	{
-		for(std::size_t i = 0; i < sizeof(base_type); ++i)
-		{
-			data[(sizeof(base_type)-1) - i] = static_cast<std::byte>(static_cast<uint8>((uval >> (i*8)) & 0xffu));
-		}
-	}
-	return data;
-}
-
-template <typename T, typename Tendian, std::size_t size>
-MPT_CONSTEXPRINLINE T EndianDecode(std::array<std::byte, size> data) noexcept
-{
-	static_assert(Tendian::endian == mpt::endian::little || Tendian::endian == mpt::endian::big);
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(!std::numeric_limits<T>::is_signed);
-	static_assert(sizeof(T) == size);
-	using base_type = T;
-	using unsigned_base_type = typename std::make_unsigned<base_type>::type;
-	using endian_type = Tendian;
-	base_type val = base_type();
-	unsigned_base_type uval = unsigned_base_type();
-	if constexpr(endian_type::endian == mpt::endian::little)
-	{
-		for(std::size_t i = 0; i < sizeof(base_type); ++i)
-		{
-			uval |= static_cast<unsigned_base_type>(static_cast<uint8>(data[i])) << (i*8);
-		}
-	} else
-	{
-		for(std::size_t i = 0; i < sizeof(base_type); ++i)
-		{
-			uval |= static_cast<unsigned_base_type>(static_cast<uint8>(data[(sizeof(base_type)-1) - i])) << (i*8);
-		}
-	}
-	val = static_cast<base_type>(uval);
-	return val;
-}
-
-
-namespace mpt
-{
-namespace detail
-{
-
-MPT_CONSTEXPR20_FUN uint64 SwapBytes(uint64 value) noexcept { MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) { return mpt::detail::constexpr_bswap64(value); } else { return MPT_bswap64(value); } }
-MPT_CONSTEXPR20_FUN uint32 SwapBytes(uint32 value) noexcept { MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) { return mpt::detail::constexpr_bswap32(value); } else { return MPT_bswap32(value); } }
-MPT_CONSTEXPR20_FUN uint16 SwapBytes(uint16 value) noexcept { MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) { return mpt::detail::constexpr_bswap16(value); } else { return MPT_bswap16(value); } }
-MPT_CONSTEXPR20_FUN int64  SwapBytes(int64  value) noexcept { MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) { return mpt::detail::constexpr_bswap64(value); } else { return MPT_bswap64(value); } }
-MPT_CONSTEXPR20_FUN int32  SwapBytes(int32  value) noexcept { MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) { return mpt::detail::constexpr_bswap32(value); } else { return MPT_bswap32(value); } }
-MPT_CONSTEXPR20_FUN int16  SwapBytes(int16  value) noexcept { MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) { return mpt::detail::constexpr_bswap16(value); } else { return MPT_bswap16(value); } }
-
-// Do NOT remove these overloads, even if they seem useless.
-// We do not want risking to extend 8bit integers to int and then
-// endian-converting and casting back to int.
-// Thus these overloads.
-MPT_CONSTEXPR20_FUN uint8  SwapBytes(uint8  value) noexcept { return value; }
-MPT_CONSTEXPR20_FUN int8   SwapBytes(int8   value) noexcept { return value; }
-MPT_CONSTEXPR20_FUN char   SwapBytes(char   value) noexcept { return value; }
-
-} // namespace detail
-} // namespace mpt
-
-#undef MPT_bswap16
-#undef MPT_bswap32
-#undef MPT_bswap64
-
-
-// 1.0f --> 0x3f800000u
-MPT_FORCEINLINE uint32 EncodeIEEE754binary32(float32 f)
-{
-	if constexpr(mpt::float_traits<float32>::is_ieee754_binary32ne)
-	{
-		return mpt::bit_cast<uint32>(f);
-	} else
-	{
-		int e = 0;
-		float m = std::frexp(f, &e);
-		if(e == 0 && std::fabs(m) == 0.0f)
-		{
-			uint32 expo = 0u;
-			uint32 sign = std::signbit(m) ? 0x01u : 0x00u;
-			uint32 mant = 0u;
-			uint32 i = 0u;
-			i |= (mant <<  0) & 0x007fffffu;
-			i |= (expo << 23) & 0x7f800000u;
-			i |= (sign << 31) & 0x80000000u;
-			return i;
-		} else
-		{
-			uint32 expo = e + 127 - 1;
-			uint32 sign = std::signbit(m) ? 0x01u : 0x00u;
-			uint32 mant = static_cast<uint32>(std::fabs(std::ldexp(m, 24)));
-			uint32 i = 0u;
-			i |= (mant <<  0) & 0x007fffffu;
-			i |= (expo << 23) & 0x7f800000u;
-			i |= (sign << 31) & 0x80000000u;
-			return i;
-		}
-	}
-}
-MPT_FORCEINLINE uint64 EncodeIEEE754binary64(float64 f)
-{
-	if constexpr(mpt::float_traits<float64>::is_ieee754_binary64ne)
-	{
-		return mpt::bit_cast<uint64>(f);
-	} else
-	{
-		int e = 0;
-		double m = std::frexp(f, &e);
-		if(e == 0 && std::fabs(m) == 0.0)
-		{
-			uint64 expo = 0u;
-			uint64 sign = std::signbit(m) ? 0x01u : 0x00u;
-			uint64 mant = 0u;
-			uint64 i = 0u;
-			i |= (mant <<  0) & 0x000fffffffffffffull;
-			i |= (expo << 52) & 0x7ff0000000000000ull;
-			i |= (sign << 63) & 0x8000000000000000ull;
-			return i;
-		} else
-		{
-			uint64 expo = static_cast<int64>(e) + 1023 - 1;
-			uint64 sign = std::signbit(m) ? 0x01u : 0x00u;
-			uint64 mant = static_cast<uint64>(std::fabs(std::ldexp(m, 53)));
-			uint64 i = 0u;
-			i |= (mant <<  0) & 0x000fffffffffffffull;
-			i |= (expo << 52) & 0x7ff0000000000000ull;
-			i |= (sign << 63) & 0x8000000000000000ull;
-			return i;
-		}
-	}
-}
-
-// 0x3f800000u --> 1.0f
-MPT_FORCEINLINE float32 DecodeIEEE754binary32(uint32 i)
-{
-	if constexpr(mpt::float_traits<float32>::is_ieee754_binary32ne)
-	{
-		return mpt::bit_cast<float32>(i);
-	} else
-	{
-		uint32 mant = (i & 0x007fffffu) >>  0;
-		uint32 expo = (i & 0x7f800000u) >> 23;
-		uint32 sign = (i & 0x80000000u) >> 31;
-		if(expo == 0)
-		{
-			float m = sign ? -static_cast<float>(mant) : static_cast<float>(mant);
-			int e = static_cast<int>(expo) - 127 + 1 - 24;
-			float f = std::ldexp(m, e);
-			return static_cast<float32>(f);
-		} else
-		{
-			mant |= 0x00800000u;
-			float m = sign ? -static_cast<float>(mant) : static_cast<float>(mant);
-			int e = static_cast<int>(expo) - 127 + 1 - 24;
-			float f = std::ldexp(m, e);
-			return static_cast<float32>(f);
-		}
-	}
-}
-MPT_FORCEINLINE float64 DecodeIEEE754binary64(uint64 i)
-{
-	if constexpr(mpt::float_traits<float64>::is_ieee754_binary64ne)
-	{
-		return mpt::bit_cast<float64>(i);
-	} else
-	{
-		uint64 mant = (i & 0x000fffffffffffffull) >>  0;
-		uint64 expo = (i & 0x7ff0000000000000ull) >> 52;
-		uint64 sign = (i & 0x8000000000000000ull) >> 63;
-		if(expo == 0)
-		{
-			double m = sign ? -static_cast<double>(mant) : static_cast<double>(mant);
-			int e = static_cast<int>(expo) - 1023 + 1 - 53;
-			double f = std::ldexp(m, e);
-			return static_cast<float64>(f);
-		} else
-		{
-			mant |= 0x0010000000000000ull;
-			double m = sign ? -static_cast<double>(mant) : static_cast<double>(mant);
-			int e = static_cast<int>(expo) - 1023 + 1 - 53;
-			double f = std::ldexp(m, e);
-			return static_cast<float64>(f);
-		}
-	}
-}
-
-
-// template parameters are byte indices corresponding to the individual bytes of iee754 in memory
-template<std::size_t hihi, std::size_t hilo, std::size_t lohi, std::size_t lolo>
-struct IEEE754binary32Emulated
-{
-public:
-	using self_t = IEEE754binary32Emulated<hihi,hilo,lohi,lolo>;
-	std::byte bytes[4];
-public:
-	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const
-	{
-		return bytes[i];
-	}
-	IEEE754binary32Emulated() = default;
-	MPT_FORCEINLINE explicit IEEE754binary32Emulated(float32 f)
-	{
-		SetInt32(EncodeIEEE754binary32(f));
-	}
-	// b0...b3 are in memory order, i.e. depend on the endianness of this type
-	// little endian: (0x00,0x00,0x80,0x3f)
-	// big endian:    (0x3f,0x80,0x00,0x00)
-	MPT_FORCEINLINE explicit IEEE754binary32Emulated(std::byte b0, std::byte b1, std::byte b2, std::byte b3)
-	{
-		bytes[0] = b0;
-		bytes[1] = b1;
-		bytes[2] = b2;
-		bytes[3] = b3;
-	}
-	MPT_FORCEINLINE operator float32 () const
-	{
-		return DecodeIEEE754binary32(GetInt32());
-	}
-	MPT_FORCEINLINE self_t & SetInt32(uint32 i)
-	{
-		bytes[hihi] = static_cast<std::byte>(i >> 24);
-		bytes[hilo] = static_cast<std::byte>(i >> 16);
-		bytes[lohi] = static_cast<std::byte>(i >>  8);
-		bytes[lolo] = static_cast<std::byte>(i >>  0);
-		return *this;
-	}
-	MPT_FORCEINLINE uint32 GetInt32() const
-	{
-		return 0u
-			| (static_cast<uint32>(bytes[hihi]) << 24)
-			| (static_cast<uint32>(bytes[hilo]) << 16)
-			| (static_cast<uint32>(bytes[lohi]) <<  8)
-			| (static_cast<uint32>(bytes[lolo]) <<  0)
-			;
-	}
-	MPT_FORCEINLINE bool operator == (const self_t &cmp) const
-	{
-		return true
-			&& bytes[0] == cmp.bytes[0]
-			&& bytes[1] == cmp.bytes[1]
-			&& bytes[2] == cmp.bytes[2]
-			&& bytes[3] == cmp.bytes[3]
-			;
-	}
-	MPT_FORCEINLINE bool operator != (const self_t &cmp) const
-	{
-		return !(*this == cmp);
-	}
-};
-template<std::size_t hihihi, std::size_t hihilo, std::size_t hilohi, std::size_t hilolo, std::size_t lohihi, std::size_t lohilo, std::size_t lolohi, std::size_t lololo>
-struct IEEE754binary64Emulated
-{
-public:
-	using self_t = IEEE754binary64Emulated<hihihi,hihilo,hilohi,hilolo,lohihi,lohilo,lolohi,lololo>;
-	std::byte bytes[8];
-public:
-	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const
-	{
-		return bytes[i];
-	}
-	IEEE754binary64Emulated() = default;
-	MPT_FORCEINLINE explicit IEEE754binary64Emulated(float64 f)
-	{
-		SetInt64(EncodeIEEE754binary64(f));
-	}
-	MPT_FORCEINLINE explicit IEEE754binary64Emulated(std::byte b0, std::byte b1, std::byte b2, std::byte b3, std::byte b4, std::byte b5, std::byte b6, std::byte b7)
-	{
-		bytes[0] = b0;
-		bytes[1] = b1;
-		bytes[2] = b2;
-		bytes[3] = b3;
-		bytes[4] = b4;
-		bytes[5] = b5;
-		bytes[6] = b6;
-		bytes[7] = b7;
-	}
-	MPT_FORCEINLINE operator float64 () const
-	{
-		return DecodeIEEE754binary64(GetInt64());
-	}
-	MPT_FORCEINLINE self_t & SetInt64(uint64 i)
-	{
-		bytes[hihihi] = static_cast<std::byte>(i >> 56);
-		bytes[hihilo] = static_cast<std::byte>(i >> 48);
-		bytes[hilohi] = static_cast<std::byte>(i >> 40);
-		bytes[hilolo] = static_cast<std::byte>(i >> 32);
-		bytes[lohihi] = static_cast<std::byte>(i >> 24);
-		bytes[lohilo] = static_cast<std::byte>(i >> 16);
-		bytes[lolohi] = static_cast<std::byte>(i >>  8);
-		bytes[lololo] = static_cast<std::byte>(i >>  0);
-		return *this;
-	}
-	MPT_FORCEINLINE uint64 GetInt64() const
-	{
-		return 0u
-			| (static_cast<uint64>(bytes[hihihi]) << 56)
-			| (static_cast<uint64>(bytes[hihilo]) << 48)
-			| (static_cast<uint64>(bytes[hilohi]) << 40)
-			| (static_cast<uint64>(bytes[hilolo]) << 32)
-			| (static_cast<uint64>(bytes[lohihi]) << 24)
-			| (static_cast<uint64>(bytes[lohilo]) << 16)
-			| (static_cast<uint64>(bytes[lolohi]) <<  8)
-			| (static_cast<uint64>(bytes[lololo]) <<  0)
-			;
-	}
-	MPT_FORCEINLINE bool operator == (const self_t &cmp) const
-	{
-		return true
-			&& bytes[0] == cmp.bytes[0]
-			&& bytes[1] == cmp.bytes[1]
-			&& bytes[2] == cmp.bytes[2]
-			&& bytes[3] == cmp.bytes[3]
-			&& bytes[4] == cmp.bytes[4]
-			&& bytes[5] == cmp.bytes[5]
-			&& bytes[6] == cmp.bytes[6]
-			&& bytes[7] == cmp.bytes[7]
-			;
-	}
-	MPT_FORCEINLINE bool operator != (const self_t &cmp) const
-	{
-		return !(*this == cmp);
-	}
-};
-
-using IEEE754binary32EmulatedBE = IEEE754binary32Emulated<0,1,2,3>;
-using IEEE754binary32EmulatedLE = IEEE754binary32Emulated<3,2,1,0>;
-using IEEE754binary64EmulatedBE = IEEE754binary64Emulated<0,1,2,3,4,5,6,7>;
-using IEEE754binary64EmulatedLE = IEEE754binary64Emulated<7,6,5,4,3,2,1,0>;
-
-MPT_BINARY_STRUCT(IEEE754binary32EmulatedBE, 4)
-MPT_BINARY_STRUCT(IEEE754binary32EmulatedLE, 4)
-MPT_BINARY_STRUCT(IEEE754binary64EmulatedBE, 8)
-MPT_BINARY_STRUCT(IEEE754binary64EmulatedLE, 8)
-
-template <mpt::endian endian = mpt::endian::native>
-struct IEEE754binary32Native
-{
-public:
-	float32 value;
-public:
-	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const
-	{
-		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
-		if constexpr(endian == mpt::endian::little)
-		{
-			return static_cast<std::byte>(EncodeIEEE754binary32(value) >> (i*8));
-		}
-		if constexpr(endian == mpt::endian::big)
-		{
-			return static_cast<std::byte>(EncodeIEEE754binary32(value) >> ((4-1-i)*8));
-		}
-	}
-	IEEE754binary32Native() = default;
-	MPT_FORCEINLINE explicit IEEE754binary32Native(float32 f)
-	{
-		value = f;
-	}
-	// b0...b3 are in memory order, i.e. depend on the endianness of this type
-	// little endian: (0x00,0x00,0x80,0x3f)
-	// big endian:    (0x3f,0x80,0x00,0x00)
-	MPT_FORCEINLINE explicit IEEE754binary32Native(std::byte b0, std::byte b1, std::byte b2, std::byte b3)
-	{
-		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
-		if constexpr(endian == mpt::endian::little)
-		{
-			value = DecodeIEEE754binary32(0u
-				| (static_cast<uint32>(b0) <<  0)
-				| (static_cast<uint32>(b1) <<  8)
-				| (static_cast<uint32>(b2) << 16)
-				| (static_cast<uint32>(b3) << 24)
-				);
-		}
-		if constexpr(endian == mpt::endian::big)
-		{
-			value = DecodeIEEE754binary32(0u
-				| (static_cast<uint32>(b0) << 24)
-				| (static_cast<uint32>(b1) << 16)
-				| (static_cast<uint32>(b2) <<  8)
-				| (static_cast<uint32>(b3) <<  0)
-				);
-		}
-	}
-	MPT_FORCEINLINE operator float32 () const
-	{
-		return value;
-	}
-	MPT_FORCEINLINE IEEE754binary32Native & SetInt32(uint32 i)
-	{
-		value = DecodeIEEE754binary32(i);
-		return *this;
-	}
-	MPT_FORCEINLINE uint32 GetInt32() const
-	{
-		return EncodeIEEE754binary32(value);
-	}
-	MPT_FORCEINLINE bool operator == (const IEEE754binary32Native &cmp) const
-	{
-		return value == cmp.value;
-	}
-	MPT_FORCEINLINE bool operator != (const IEEE754binary32Native &cmp) const
-	{
-		return value != cmp.value;
-	}
-};
-
-template <mpt::endian endian = mpt::endian::native>
-struct IEEE754binary64Native
-{
-public:
-	float64 value;
-public:
-	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const
-	{
-		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
-		if constexpr(endian == mpt::endian::little)
-		{
-			return mpt::byte_cast<std::byte>(static_cast<uint8>(EncodeIEEE754binary64(value) >> (i*8)));
-		}
-		if constexpr(endian == mpt::endian::big)
-		{
-			return mpt::byte_cast<std::byte>(static_cast<uint8>(EncodeIEEE754binary64(value) >> ((8-1-i)*8)));
-		}
-	}
-	IEEE754binary64Native() = default;
-	MPT_FORCEINLINE explicit IEEE754binary64Native(float64 f)
-	{
-		value = f;
-	}
-	MPT_FORCEINLINE explicit IEEE754binary64Native(std::byte b0, std::byte b1, std::byte b2, std::byte b3, std::byte b4, std::byte b5, std::byte b6, std::byte b7)
-	{
-		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
-		if constexpr(endian == mpt::endian::little)
-		{
-			value = DecodeIEEE754binary64(0ull
-				| (static_cast<uint64>(b0) <<  0)
-				| (static_cast<uint64>(b1) <<  8)
-				| (static_cast<uint64>(b2) << 16)
-				| (static_cast<uint64>(b3) << 24)
-				| (static_cast<uint64>(b4) << 32)
-				| (static_cast<uint64>(b5) << 40)
-				| (static_cast<uint64>(b6) << 48)
-				| (static_cast<uint64>(b7) << 56)
-				);
-		}
-		if constexpr(endian == mpt::endian::big)
-		{
-			value = DecodeIEEE754binary64(0ull
-				| (static_cast<uint64>(b0) << 56)
-				| (static_cast<uint64>(b1) << 48)
-				| (static_cast<uint64>(b2) << 40)
-				| (static_cast<uint64>(b3) << 32)
-				| (static_cast<uint64>(b4) << 24)
-				| (static_cast<uint64>(b5) << 16)
-				| (static_cast<uint64>(b6) <<  8)
-				| (static_cast<uint64>(b7) <<  0)
-				);
-		}
-	}
-	MPT_FORCEINLINE operator float64 () const
-	{
-		return value;
-	}
-	MPT_FORCEINLINE IEEE754binary64Native & SetInt64(uint64 i)
-	{
-		value = DecodeIEEE754binary64(i);
-		return *this;
-	}
-	MPT_FORCEINLINE uint64 GetInt64() const
-	{
-		return EncodeIEEE754binary64(value);
-	}
-	MPT_FORCEINLINE bool operator == (const IEEE754binary64Native &cmp) const
-	{
-		return value == cmp.value;
-	}
-	MPT_FORCEINLINE bool operator != (const IEEE754binary64Native &cmp) const
-	{
-		return value != cmp.value;
-	}
-};
-
-static_assert((sizeof(IEEE754binary32Native<>) == 4));
-static_assert((sizeof(IEEE754binary64Native<>) == 8));
-
-namespace mpt {
-template <> struct is_binary_safe< IEEE754binary32Native<> > : public std::true_type { };
-template <> struct is_binary_safe< IEEE754binary64Native<> > : public std::true_type { };
-}
-
-template <bool is_ieee754, mpt::endian endian = mpt::endian::native> struct IEEE754binary_types {
-	using IEEE754binary32LE = IEEE754binary32EmulatedLE;
-	using IEEE754binary32BE = IEEE754binary32EmulatedBE;
-	using IEEE754binary64LE = IEEE754binary64EmulatedLE;
-	using IEEE754binary64BE = IEEE754binary64EmulatedBE;
-};
-template <> struct IEEE754binary_types<true, mpt::endian::little> {
-	using IEEE754binary32LE = IEEE754binary32Native<>;
-	using IEEE754binary32BE = IEEE754binary32EmulatedBE;
-	using IEEE754binary64LE = IEEE754binary64Native<>;
-	using IEEE754binary64BE = IEEE754binary64EmulatedBE;
-};
-template <> struct IEEE754binary_types<true, mpt::endian::big> {
-	using IEEE754binary32LE = IEEE754binary32EmulatedLE;
-	using IEEE754binary32BE = IEEE754binary32Native<>;
-	using IEEE754binary64LE = IEEE754binary64EmulatedLE;
-	using IEEE754binary64BE = IEEE754binary64Native<>;
-};
-
-using IEEE754binary32LE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32LE;
-using IEEE754binary32BE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32BE;
-using IEEE754binary64LE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64LE;
-using IEEE754binary64BE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64BE;
-
-static_assert(sizeof(IEEE754binary32LE) == 4);
-static_assert(sizeof(IEEE754binary32BE) == 4);
-static_assert(sizeof(IEEE754binary64LE) == 8);
-static_assert(sizeof(IEEE754binary64BE) == 8);
-
-
-// unaligned
-
-using float32le = IEEE754binary32EmulatedLE;
-using float32be = IEEE754binary32EmulatedBE;
-using float64le = IEEE754binary64EmulatedLE;
-using float64be = IEEE754binary64EmulatedBE;
-
-static_assert(sizeof(float32le) == 4);
-static_assert(sizeof(float32be) == 4);
-static_assert(sizeof(float64le) == 8);
-static_assert(sizeof(float64be) == 8);
-
-
-// potentially aligned
-
-using float32le_fast = IEEE754binary32LE;
-using float32be_fast = IEEE754binary32BE;
-using float64le_fast = IEEE754binary64LE;
-using float64be_fast = IEEE754binary64BE;
-
-static_assert(sizeof(float32le_fast) == 4);
-static_assert(sizeof(float32be_fast) == 4);
-static_assert(sizeof(float64le_fast) == 8);
-static_assert(sizeof(float64be_fast) == 8);
-
-
-
-// On-disk integer types with defined endianness and no alignemnt requirements
-// Note: To easily debug module loaders (and anything else that uses this
-// wrapper struct), you can use the Debugger Visualizers available in
-// build/vs/debug/ to conveniently view the wrapped contents.
-
-template<typename T, typename Tendian>
-struct packed
-{
-public:
-	using base_type = T;
-	using endian_type = Tendian;
-public:
-	std::array<std::byte, sizeof(base_type)> data;
-public:
-	MPT_CONSTEXPR20_FUN void set(base_type val) noexcept
-	{
-		static_assert(std::numeric_limits<T>::is_integer);
-		MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20())
-		{
-			if constexpr(endian_type::endian == mpt::endian::big)
-			{
-				typename std::make_unsigned<base_type>::type uval = val;
-				for(std::size_t i = 0; i < sizeof(base_type); ++i)
-				{
-					data[i] = static_cast<std::byte>((uval >> (8*(sizeof(base_type)-1-i))) & 0xffu);
-				}
-			} else
-			{
-				typename std::make_unsigned<base_type>::type uval = val;
-				for(std::size_t i = 0; i < sizeof(base_type); ++i)
-				{
-					data[i] = static_cast<std::byte>((uval >> (8*i)) & 0xffu);
-				}
-			}
-		} else
-		{
-			if constexpr(mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big)
-			{
-				if constexpr(mpt::endian::native != endian_type::endian)
-				{
-					val = mpt::detail::SwapBytes(val);
-				}
-				std::memcpy(data.data(), &val, sizeof(val));
-			} else
-			{
-				using unsigned_base_type = typename std::make_unsigned<base_type>::type;
-				data = EndianEncode<unsigned_base_type, Tendian, sizeof(T)>(val);
-			}
-		}
-	}
-	MPT_CONSTEXPR20_FUN base_type get() const noexcept
-	{
-		static_assert(std::numeric_limits<T>::is_integer);
-		MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20())
-		{
-			if constexpr(endian_type::endian == mpt::endian::big)
-			{
-				typename std::make_unsigned<base_type>::type uval = 0;
-				for(std::size_t i = 0; i < sizeof(base_type); ++i)
-				{
-					uval |= static_cast<typename std::make_unsigned<base_type>::type>(data[i]) << (8*(sizeof(base_type)-1-i));
-				}
-				return static_cast<base_type>(uval);
-			} else
-			{
-				typename std::make_unsigned<base_type>::type uval = 0;
-				for(std::size_t i = 0; i < sizeof(base_type); ++i)
-				{
-					uval |= static_cast<typename std::make_unsigned<base_type>::type>(data[i]) << (8*i);
-				}
-				return static_cast<base_type>(uval);
-			}
-		} else
-		{
-			if constexpr(mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big)
-			{
-				base_type val = base_type();
-				std::memcpy(&val, data.data(), sizeof(val));
-				if constexpr(mpt::endian::native != endian_type::endian)
-				{
-					val = mpt::detail::SwapBytes(val);
-				}
-				return val;
-			} else
-			{
-				using unsigned_base_type = typename std::make_unsigned<base_type>::type;
-				return EndianDecode<unsigned_base_type, Tendian, sizeof(T)>(data);
-			}
-		}
-	}
-	MPT_CONSTEXPR20_FUN packed & operator = (const base_type & val) noexcept { set(val); return *this; }
-	MPT_CONSTEXPR20_FUN operator base_type () const noexcept { return get(); }
-public:
-	MPT_CONSTEXPR20_FUN packed & operator &= (base_type val) noexcept { set(get() & val); return *this; }
-	MPT_CONSTEXPR20_FUN packed & operator |= (base_type val) noexcept { set(get() | val); return *this; }
-	MPT_CONSTEXPR20_FUN packed & operator ^= (base_type val) noexcept { set(get() ^ val); return *this; }
-	MPT_CONSTEXPR20_FUN packed & operator += (base_type val) noexcept { set(get() + val); return *this; }
-	MPT_CONSTEXPR20_FUN packed & operator -= (base_type val) noexcept { set(get() - val); return *this; }
-	MPT_CONSTEXPR20_FUN packed & operator *= (base_type val) noexcept { set(get() * val); return *this; }
-	MPT_CONSTEXPR20_FUN packed & operator /= (base_type val) noexcept { set(get() / val); return *this; }
-	MPT_CONSTEXPR20_FUN packed & operator %= (base_type val) noexcept { set(get() % val); return *this; }
-	MPT_CONSTEXPR20_FUN packed & operator ++ () noexcept { set(get() + 1); return *this; } // prefix
-	MPT_CONSTEXPR20_FUN packed & operator -- () noexcept { set(get() - 1); return *this; } // prefix
-	MPT_CONSTEXPR20_FUN base_type operator ++ (int) noexcept { base_type old = get(); set(old + 1); return old; } // postfix
-	MPT_CONSTEXPR20_FUN base_type operator -- (int) noexcept { base_type old = get(); set(old - 1); return old; } // postfix
-};
-
-using int64le  = packed< int64, LittleEndian_tag>;
-using int32le  = packed< int32, LittleEndian_tag>;
-using int16le  = packed< int16, LittleEndian_tag>;
-using int8le   = packed< int8 , LittleEndian_tag>;
-using uint64le = packed<uint64, LittleEndian_tag>;
-using uint32le = packed<uint32, LittleEndian_tag>;
-using uint16le = packed<uint16, LittleEndian_tag>;
-using uint8le  = packed<uint8 , LittleEndian_tag>;
-
-using int64be  = packed< int64, BigEndian_tag>;
-using int32be  = packed< int32, BigEndian_tag>;
-using int16be  = packed< int16, BigEndian_tag>;
-using int8be   = packed< int8 , BigEndian_tag>;
-using uint64be = packed<uint64, BigEndian_tag>;
-using uint32be = packed<uint32, BigEndian_tag>;
-using uint16be = packed<uint16, BigEndian_tag>;
-using uint8be  = packed<uint8 , BigEndian_tag>;
-
-OPENMPT_NAMESPACE_END
-namespace std {
-	template <typename T, typename Tendian> class numeric_limits<OPENMPT_NAMESPACE::packed<T, Tendian>> : public std::numeric_limits<T> {};
-	template <typename T, typename Tendian> class numeric_limits<const OPENMPT_NAMESPACE::packed<T, Tendian>> : public std::numeric_limits<const T> {};
-} // namespace std
-OPENMPT_NAMESPACE_BEGIN
-
-MPT_BINARY_STRUCT(int64le, 8)
-MPT_BINARY_STRUCT(int32le, 4)
-MPT_BINARY_STRUCT(int16le, 2)
-MPT_BINARY_STRUCT(int8le , 1)
-MPT_BINARY_STRUCT(uint64le, 8)
-MPT_BINARY_STRUCT(uint32le, 4)
-MPT_BINARY_STRUCT(uint16le, 2)
-MPT_BINARY_STRUCT(uint8le , 1)
-
-MPT_BINARY_STRUCT(int64be, 8)
-MPT_BINARY_STRUCT(int32be, 4)
-MPT_BINARY_STRUCT(int16be, 2)
-MPT_BINARY_STRUCT(int8be , 1)
-MPT_BINARY_STRUCT(uint64be, 8)
-MPT_BINARY_STRUCT(uint32be, 4)
-MPT_BINARY_STRUCT(uint16be, 2)
-MPT_BINARY_STRUCT(uint8be , 1)
-
-namespace mpt {
-
-template <typename T> struct make_le { using type = packed<typename std::remove_const<T>::type, LittleEndian_tag>; };
-template <typename T> struct make_be { using type = packed<typename std::remove_const<T>::type, BigEndian_tag>; };
-
-template <typename T>
-MPT_CONSTEXPR20_FUN auto as_le(T v) noexcept -> typename mpt::make_le<typename std::remove_const<T>::type>::type
-{
-	typename mpt::make_le<typename std::remove_const<T>::type>::type res{};
-	res = v;
-	return res;
-}
-template <typename T>
-MPT_CONSTEXPR20_FUN auto as_be(T v) noexcept -> typename mpt::make_be<typename std::remove_const<T>::type>::type
-{
-	typename mpt::make_be<typename std::remove_const<T>::type>::type res{};
-	res = v;
-	return res;
-}
-
-template <typename Tpacked>
-MPT_CONSTEXPR20_FUN Tpacked as_endian(typename Tpacked::base_type v) noexcept
-{
-	Tpacked res{};
-	res = v;
-	return res;
-}
-
-} // namespace mpt
-
-
-
 // 24-bit integer wrapper (for 24-bit PCM)
 struct int24
 {
Index: common/FileReader.cpp
===================================================================
--- common/FileReader.cpp	(revision 14628)
+++ common/FileReader.cpp	(working copy)
@@ -74,9 +74,9 @@
 
 			HANDLE hFile = NULL;
 			#if MPT_OS_WINDOWS_WINRT
-				hFile = mpt::Windows::CheckFileHANDLE(CreateFile2(tempName.AsNative().c_str(), GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS, NULL));
+				hFile = mpt::windows::CheckFileHANDLE(CreateFile2(tempName.AsNative().c_str(), GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS, NULL));
 			#else
-				hFile = mpt::Windows::CheckFileHANDLE(CreateFile(tempName.AsNative().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL));
+				hFile = mpt::windows::CheckFileHANDLE(CreateFile(tempName.AsNative().c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL));
 			#endif
 			while(!file.EndOfFile())
 			{
@@ -89,7 +89,7 @@
 					DWORD chunkDone = 0;
 					try
 					{
-						mpt::Windows::CheckBOOL(WriteFile(hFile, view.data() + written, chunkSize, &chunkDone, NULL));
+						mpt::windows::CheckBOOL(WriteFile(hFile, view.data() + written, chunkSize, &chunkDone, NULL));
 					} catch(...)
 					{
 						CloseHandle(hFile);
Index: common/FileReader.h
===================================================================
--- common/FileReader.h	(revision 14628)
+++ common/FileReader.h	(working copy)
@@ -476,7 +476,7 @@
 	template<typename Tsize, mpt::String::ReadWriteMode mode, size_t destSize, typename TFileCursor>
 	bool ReadSizedString(TFileCursor &f, char (&destBuffer)[destSize], const typename TFileCursor::off_t maxLength = std::numeric_limits<typename TFileCursor::off_t>::max())
 	{
-		packed<typename Tsize::base_type, typename Tsize::endian_type> srcSize;	// Enforce usage of a packed type by ensuring that the passed type has the required typedefs
+		mpt::packed<typename Tsize::base_type, typename Tsize::endian_type> srcSize;	// Enforce usage of a packed type by ensuring that the passed type has the required typedefs
 		if(!Read(f, srcSize))
 			return false;
 		return ReadString<mode>(f, destBuffer, std::min(static_cast<typename TFileCursor::off_t>(srcSize), maxLength));
@@ -488,7 +488,7 @@
 	template<typename Tsize, mpt::String::ReadWriteMode mode, typename TFileCursor>
 	bool ReadSizedString(TFileCursor &f, std::string &dest, const typename TFileCursor::off_t maxLength = std::numeric_limits<typename TFileCursor::off_t>::max())
 	{
-		packed<typename Tsize::base_type, typename Tsize::endian_type> srcSize;	// Enforce usage of a packed type by ensuring that the passed type has the required typedefs
+		mpt::packed<typename Tsize::base_type, typename Tsize::endian_type> srcSize;	// Enforce usage of a packed type by ensuring that the passed type has the required typedefs
 		if(!Read(f, srcSize))
 			return false;
 		return ReadString<mode>(f, dest, std::min(static_cast<typename TFileCursor::off_t>(srcSize), maxLength));
@@ -500,7 +500,7 @@
 	template<typename Tsize, mpt::String::ReadWriteMode mode, std::size_t len, typename TFileCursor>
 	bool ReadSizedString(TFileCursor &f, mpt::charbuf<len> &dest, const typename TFileCursor::off_t maxLength = std::numeric_limits<typename TFileCursor::off_t>::max())
 	{
-		packed<typename Tsize::base_type, typename Tsize::endian_type> srcSize;	// Enforce usage of a packed type by ensuring that the passed type has the required typedefs
+		mpt::packed<typename Tsize::base_type, typename Tsize::endian_type> srcSize;	// Enforce usage of a packed type by ensuring that the passed type has the required typedefs
 		if(!Read(f, srcSize))
 			return false;
 		return ReadString<mode>(f, dest, std::min(static_cast<typename TFileCursor::off_t>(srcSize), maxLength));
Index: common/misc_util.cpp
===================================================================
--- common/misc_util.cpp	(revision 14628)
+++ common/misc_util.cpp	(working copy)
@@ -11,353 +11,45 @@
 #include "stdafx.h"
 #include "misc_util.h"
 
-#include "mptOSError.h"
+#include "mpt/binary/hex.hpp"
+#include "mpt/binary/base64.hpp"
+#include "mpt/binary/base64url.hpp"
 
-#if MPT_OS_WINDOWS
-#include <windows.h>
-#endif
-
-
 OPENMPT_NAMESPACE_BEGIN
 
-
-
 namespace Util
 {
 
-
-static constexpr mpt::uchar EncodeNibble[16] = {
-	UC_('0'), UC_('1'), UC_('2'), UC_('3'),
-	UC_('4'), UC_('5'), UC_('6'), UC_('7'),
-	UC_('8'), UC_('9'), UC_('A'), UC_('B'),
-	UC_('C'), UC_('D'), UC_('E'), UC_('F') };
-
-static inline bool DecodeByte(uint8 &byte, mpt::uchar c1, mpt::uchar c2)
-{
-	byte = 0;
-	if(UC_('0') <= c1 && c1 <= UC_('9'))
-	{
-		byte += static_cast<uint8>((c1 - UC_('0')) << 4);
-	} else if(UC_('A') <= c1 && c1 <= UC_('F'))
-	{
-		byte += static_cast<uint8>((c1 - UC_('A') + 10) << 4);
-	} else if(UC_('a') <= c1 && c1 <= UC_('f'))
-	{
-		byte += static_cast<uint8>((c1 - UC_('a') + 10) << 4);
-	} else
-	{
-		return false;
-	}
-	if(UC_('0') <= c2 && c2 <= UC_('9'))
-	{
-		byte += static_cast<uint8>(c2 - UC_('0'));
-	} else if(UC_('A') <= c2 && c2 <= UC_('F'))
-	{
-		byte += static_cast<uint8>(c2 - UC_('A') + 10);
-	} else if(UC_('a') <= c2 && c2 <= UC_('f'))
-	{
-		byte += static_cast<uint8>(c2 - UC_('a') + 10);
-	} else
-	{
-		return false;
-	}
-	return true;
-}
-
 mpt::ustring BinToHex(mpt::const_byte_span src)
 {
-	mpt::ustring result;
-	result.reserve(src.size() * 2);
-	for(std::byte byte : src)
-	{
-		result.push_back(EncodeNibble[(mpt::byte_cast<uint8>(byte) & 0xf0) >> 4]);
-		result.push_back(EncodeNibble[mpt::byte_cast<uint8>(byte) & 0x0f]);
-	}
-	return result;
+	return mpt::encode_hex(src);
 }
 
 std::vector<std::byte> HexToBin(const mpt::ustring &src)
 {
-	std::vector<std::byte> result;
-	result.reserve(src.size() / 2);
-	for(std::size_t i = 0; (i + 1) < src.size(); i += 2)
-	{
-		uint8 byte = 0;
-		if(!DecodeByte(byte, src[i], src[i + 1]))
-		{
-			return result;
-		}
-		result.push_back(mpt::byte_cast<std::byte>(byte));
-	}
-	return result;
+	return mpt::decode_hex(src);
 }
 
-
-
-static constexpr mpt::uchar base64url[64] = {
-	UC_('A'),UC_('B'),UC_('C'),UC_('D'),UC_('E'),UC_('F'),UC_('G'),UC_('H'),UC_('I'),UC_('J'),UC_('K'),UC_('L'),UC_('M'),UC_('N'),UC_('O'),UC_('P'),
-	UC_('Q'),UC_('R'),UC_('S'),UC_('T'),UC_('U'),UC_('V'),UC_('W'),UC_('X'),UC_('Y'),UC_('Z'),UC_('a'),UC_('b'),UC_('c'),UC_('d'),UC_('e'),UC_('f'),
-	UC_('g'),UC_('h'),UC_('i'),UC_('j'),UC_('k'),UC_('l'),UC_('m'),UC_('n'),UC_('o'),UC_('p'),UC_('q'),UC_('r'),UC_('s'),UC_('t'),UC_('u'),UC_('v'),
-	UC_('w'),UC_('x'),UC_('y'),UC_('z'),UC_('0'),UC_('1'),UC_('2'),UC_('3'),UC_('4'),UC_('5'),UC_('6'),UC_('7'),UC_('8'),UC_('9'),UC_('-'),UC_('_')
-};
-
 mpt::ustring BinToBase64url(mpt::const_byte_span src)
 {
-	mpt::ustring result;
-	result.reserve(4 * ((src.size() + 2) / 3));
-	uint32 bits = 0;
-	std::size_t bytes = 0;
-	for(std::byte byte : src)
-	{
-		bits <<= 8;
-		bits |= mpt::byte_cast<uint8>(byte);
-		bytes++;
-		if(bytes == 3)
-		{
-			result.push_back(base64url[(bits >> 18) & 0x3f]);
-			result.push_back(base64url[(bits >> 12) & 0x3f]);
-			result.push_back(base64url[(bits >> 6) & 0x3f]);
-			result.push_back(base64url[(bits >> 0) & 0x3f]);
-			bits = 0;
-			bytes = 0;
-		}
-	}
-	std::size_t padding = 0;
-	while(bytes != 0)
-	{
-		bits <<= 8;
-		padding++;
-		bytes++;
-		if(bytes == 3)
-		{
-			result.push_back(base64url[(bits >> 18) & 0x3f]);
-			result.push_back(base64url[(bits >> 12) & 0x3f]);
-			if(padding <= 1)
-			{
-				result.push_back(base64url[(bits >> 6) & 0x3f]);
-			}
-			if(padding <= 0)
-			{
-				result.push_back(base64url[(bits >> 0) & 0x3f]);
-			}
-			bits = 0;
-			bytes = 0;
-		}
-	}
-	return result;
+	return mpt::encode_base64url(src);
 }
 
-static uint8 GetBase64urlBits(mpt::uchar c)
-{
-	for(uint8 i = 0; i < 64; ++i)
-	{
-		if(base64url[i] == c)
-		{
-			return i;
-		}
-	}
-	throw base64_parse_error();
-}
-
 std::vector<std::byte> Base64urlToBin(const mpt::ustring &src)
 {
-	std::vector<std::byte> result;
-	result.reserve(3 * ((src.length() + 2) / 4));
-	uint32 bits = 0;
-	std::size_t chars = 0;
-	for(mpt::uchar c : src)
-	{
-		bits <<= 6;
-		bits |= GetBase64urlBits(c);
-		chars++;
-		if(chars == 4)
-		{
-			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
-			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
-			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
-			bits = 0;
-			chars = 0;
-		}
-	}
-	uint32 padding = 0;
-	if(chars != 0 && chars < 2)
-	{
-		throw base64_parse_error();
-	}
-	while(chars != 0)
-	{
-		bits <<= 6;
-		padding++;
-		chars++;
-		if(chars == 4)
-		{
-			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
-			if(padding < 2)
-			{
-				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
-			}
-			if(padding < 1)
-			{
-				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
-			}
-			bits = 0;
-			chars = 0;
-			padding = 0;
-		}
-	}
-	return result;
+	return mpt::decode_base64url(src);
 }
 
-
-
-static constexpr mpt::uchar base64[64] = {
-	UC_('A'),UC_('B'),UC_('C'),UC_('D'),UC_('E'),UC_('F'),UC_('G'),UC_('H'),UC_('I'),UC_('J'),UC_('K'),UC_('L'),UC_('M'),UC_('N'),UC_('O'),UC_('P'),
-	UC_('Q'),UC_('R'),UC_('S'),UC_('T'),UC_('U'),UC_('V'),UC_('W'),UC_('X'),UC_('Y'),UC_('Z'),UC_('a'),UC_('b'),UC_('c'),UC_('d'),UC_('e'),UC_('f'),
-	UC_('g'),UC_('h'),UC_('i'),UC_('j'),UC_('k'),UC_('l'),UC_('m'),UC_('n'),UC_('o'),UC_('p'),UC_('q'),UC_('r'),UC_('s'),UC_('t'),UC_('u'),UC_('v'),
-	UC_('w'),UC_('x'),UC_('y'),UC_('z'),UC_('0'),UC_('1'),UC_('2'),UC_('3'),UC_('4'),UC_('5'),UC_('6'),UC_('7'),UC_('8'),UC_('9'),UC_('+'),UC_('/')
-};
-
 mpt::ustring BinToBase64(mpt::const_byte_span src)
 {
-	mpt::ustring result;
-	result.reserve(4 * ((src.size() + 2) / 3));
-	uint32 bits = 0;
-	std::size_t bytes = 0;
-	for(std::byte byte : src)
-	{
-		bits <<= 8;
-		bits |= mpt::byte_cast<uint8>(byte);
-		bytes++;
-		if(bytes == 3)
-		{
-			result.push_back(base64[(bits >> 18) & 0x3f]);
-			result.push_back(base64[(bits >> 12) & 0x3f]);
-			result.push_back(base64[(bits >> 6) & 0x3f]);
-			result.push_back(base64[(bits >> 0) & 0x3f]);
-			bits = 0;
-			bytes = 0;
-		}
-	}
-	std::size_t padding = 0;
-	while(bytes != 0)
-	{
-		bits <<= 8;
-		padding++;
-		bytes++;
-		if(bytes == 3)
-		{
-			result.push_back(base64[(bits >> 18) & 0x3f]);
-			result.push_back(base64[(bits >> 12) & 0x3f]);
-			if(padding > 1)
-			{
-				result.push_back(UC_('='));
-			} else
-			{
-				result.push_back(base64[(bits >> 6) & 0x3f]);
-			}
-			if(padding > 0)
-			{
-				result.push_back(UC_('='));
-			} else
-			{
-				result.push_back(base64[(bits >> 0) & 0x3f]);
-			}
-			bits = 0;
-			bytes = 0;
-		}
-	}
-	return result;
+	return mpt::encode_base64(src);
 }
 
-static uint8 GetBase64Bits(mpt::uchar c)
-{
-	for(uint8 i = 0; i < 64; ++i)
-	{
-		if(base64[i] == c)
-		{
-			return i;
-		}
-	}
-	throw base64_parse_error();
-}
-
 std::vector<std::byte> Base64ToBin(const mpt::ustring &src)
 {
-	std::vector<std::byte> result;
-	result.reserve(3 * (src.length() / 4));
-	uint32 bits = 0;
-	std::size_t chars = 0;
-	std::size_t padding = 0;
-	for(mpt::uchar c : src)
-	{
-		bits <<= 6;
-		if(c == UC_('='))
-		{
-			padding++;
-		} else
-		{
-			bits |= GetBase64Bits(c);
-		}
-		chars++;
-		if(chars == 4)
-		{
-			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
-			if(padding < 2)
-			{
-				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
-			}
-			if(padding < 1)
-			{
-				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
-			}
-			bits = 0;
-			chars = 0;
-			padding = 0;
-		}
-	}
-	if(chars != 0)
-	{
-		throw base64_parse_error();
-	}
-	return result;
+	return mpt::decode_base64(src);
 }
 
-
 } // namespace Util
 
-
-#if defined(MODPLUG_TRACKER) || (defined(LIBOPENMPT_BUILD) && defined(LIBOPENMPT_BUILD_TEST))
-
-namespace mpt
-{
-
-std::optional<mpt::ustring> getenv(const mpt::ustring &env_var)
-{
-	#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
-		MPT_UNREFERENCED_PARAMETER(env_var);
-		return std::nullopt;
-	#elif MPT_OS_WINDOWS && defined(UNICODE)
-		std::vector<WCHAR> buf(32767);
-		DWORD size = GetEnvironmentVariable(mpt::ToWide(env_var).c_str(), buf.data(), 32767);
-		if(size == 0)
-		{
-			mpt::Windows::ExpectError(ERROR_ENVVAR_NOT_FOUND);
-			return std::nullopt;
-		}
-		return mpt::ToUnicode(buf.data());
-	#else
-		const char *val = std::getenv(mpt::ToCharset(mpt::CharsetEnvironment, env_var).c_str());
-		if(!val)
-		{
-			return std::nullopt;
-		}
-		return mpt::ToUnicode(mpt::CharsetEnvironment, val);
-	#endif
-}
-
-} // namespace mpt
-
-#endif // MODPLUG_TRACKER || (LIBOPENMPT_BUILD && LIBOPENMPT_BUILD_TEST)
-
-
 OPENMPT_NAMESPACE_END
Index: common/misc_util.h
===================================================================
--- common/misc_util.h	(revision 14628)
+++ common/misc_util.h	(working copy)
@@ -38,12 +38,16 @@
 #include <stdlib.h>
 
 
+
 OPENMPT_NAMESPACE_BEGIN
 
 
+
 namespace Util
 {
 
+
+
 	// Insert a range of items [insStart,  insEnd], and possibly shift item fix to the left.
 	template<typename T>
 	void InsertItem(const T insStart, const T insEnd, T &fix)
@@ -109,13 +113,8 @@
 		}
 	}
 
-} // namespace Util
 
 
-
-namespace Util
-{
-
 	template<typename T, std::size_t n>
 	class fixed_size_queue
 	{
@@ -202,73 +201,50 @@
 		}
 	};
 
-} // namespace Util
 
 
-namespace Util
-{
+	std::vector<std::byte> HexToBin(const mpt::ustring &src);
+	mpt::ustring BinToHex(mpt::const_byte_span src);
+	template <typename T> inline mpt::ustring BinToHex(mpt::span<T> src) { return Util::BinToHex(mpt::byte_cast<mpt::const_byte_span>(src)); }
 
-std::vector<std::byte> HexToBin(const mpt::ustring &src);
-mpt::ustring BinToHex(mpt::const_byte_span src);
-template <typename T> inline mpt::ustring BinToHex(mpt::span<T> src) { return Util::BinToHex(mpt::byte_cast<mpt::const_byte_span>(src)); }
+	using base64_parse_error = std::runtime_error;
 
-class base64_parse_error : public std::runtime_error
-{
-public:
-	base64_parse_error()
-		: std::runtime_error("invalid Base64 encoding")
-	{
-	}
-};
+	std::vector<std::byte> Base64ToBin(const mpt::ustring &src);
+	mpt::ustring BinToBase64(mpt::const_byte_span src);
+	template <typename T> inline mpt::ustring BinToBase64(mpt::span<T> src) { return Util::BinToBase64(mpt::byte_cast<mpt::const_byte_span>(src)); }
 
-std::vector<std::byte> Base64ToBin(const mpt::ustring &src);
-mpt::ustring BinToBase64(mpt::const_byte_span src);
-template <typename T> inline mpt::ustring BinToBase64(mpt::span<T> src) { return Util::BinToBase64(mpt::byte_cast<mpt::const_byte_span>(src)); }
+	std::vector<std::byte> Base64urlToBin(const mpt::ustring &src);
+	mpt::ustring BinToBase64url(mpt::const_byte_span src);
+	template <typename T> inline mpt::ustring BinToBase64url(mpt::span<T> src) { return Util::BinToBase64url(mpt::byte_cast<mpt::const_byte_span>(src)); }
 
-std::vector<std::byte> Base64urlToBin(const mpt::ustring &src);
-mpt::ustring BinToBase64url(mpt::const_byte_span src);
-template <typename T> inline mpt::ustring BinToBase64url(mpt::span<T> src) { return Util::BinToBase64url(mpt::byte_cast<mpt::const_byte_span>(src)); }
 
-} // namespace Util
 
-namespace Util
-{
-
-template <typename T>
-class heap_value
-{
-private:
-	std::unique_ptr<T> m_value{};
-public:
-	template <typename ... Targs>
-	heap_value(Targs && ... args)
-		: m_value(std::make_unique<T>(std::forward<Targs>(args) ...))
+	template <typename T>
+	class heap_value
 	{
-		return;
-	}
-	const T & value() const
-	{
-		return *m_value;
-	}
-	T & value()
-	{
-		return *m_value;
-	}
-};
+	private:
+		std::unique_ptr<T> m_value{};
+	public:
+		template <typename ... Targs>
+		heap_value(Targs && ... args)
+			: m_value(std::make_unique<T>(std::forward<Targs>(args) ...))
+		{
+			return;
+		}
+		const T & value() const
+		{
+			return *m_value;
+		}
+		T & value()
+		{
+			return *m_value;
+		}
+	};
 
-} // namespace Util
 
-#if defined(MODPLUG_TRACKER) || (defined(LIBOPENMPT_BUILD) && defined(LIBOPENMPT_BUILD_TEST))
 
-namespace mpt
-{
+} // namespace Util
 
-// Wrapper around std::getenv.
-std::optional<mpt::ustring> getenv(const mpt::ustring &env_var);
 
-} // namespace mpt
 
-#endif // MODPLUG_TRACKER || (LIBOPENMPT_BUILD && LIBOPENMPT_BUILD_TEST)
-
-
 OPENMPT_NAMESPACE_END
Index: common/mptAlloc.h
===================================================================
--- common/mptAlloc.h	(revision 14628)
+++ common/mptAlloc.h	(working copy)
@@ -14,6 +14,8 @@
 
 
 
+#include "mpt/base/alloc.hpp"
+
 #include "mptBaseMacros.h"
 #include "mptMemory.h"
 #include "mptSpan.h"
@@ -34,108 +36,6 @@
 OPENMPT_NAMESPACE_BEGIN
 
 
-
-namespace mpt {
-
-
-
-template <typename T> inline mpt::span<T> as_span(std::vector<T> & cont)
-{
-	return mpt::span<T>(cont.data(), cont.data() + cont.size());
-}
-
-template <typename T> inline mpt::span<const T> as_span(const std::vector<T> & cont)
-{
-	return mpt::span<const T>(cont.data(), cont.data() + cont.size());
-}
-
-
-
-template <typename T> inline std::vector<typename std::remove_const<T>::type> make_vector(T * beg, T * end)
-{
-	return std::vector<typename std::remove_const<T>::type>(beg, end);
-}
-
-template <typename T> inline std::vector<typename std::remove_const<T>::type> make_vector(T * data, std::size_t size)
-{
-	return std::vector<typename std::remove_const<T>::type>(data, data + size);
-}
-
-template <typename T> inline std::vector<typename std::remove_const<T>::type> make_vector(mpt::span<T> data)
-{
-	return std::vector<typename std::remove_const<T>::type>(data.data(), data.data() + data.size());
-}
-
-template <typename T, std::size_t N> inline std::vector<typename std::remove_const<T>::type> make_vector(T (&arr)[N])
-{
-	return std::vector<typename std::remove_const<T>::type>(std::begin(arr), std::end(arr));
-}
-
-
-
-template <typename Tcont2, typename Tcont1> inline Tcont1 & append(Tcont1 & cont1, const Tcont2 & cont2)
-{
-	cont1.insert(cont1.end(), cont2.begin(), cont2.end());
-	return cont1;
-}
-
-template <typename Tit2, typename Tcont1> inline Tcont1 & append(Tcont1 & cont1, Tit2 beg, Tit2 end)
-{
-	cont1.insert(cont1.end(), beg, end);
-	return cont1;
-}
-
-
-
-template <typename Tdst, typename Tsrc>
-struct buffer_cast_impl
-{
-	inline Tdst operator () (const Tsrc &src) const
-	{
-		return Tdst(mpt::byte_cast<const typename Tdst::value_type *>(src.data()), mpt::byte_cast<const typename Tdst::value_type *>(src.data()) + src.size());
-	}
-};
-
-// casts between vector<->string of byte-castable types
-template <typename Tdst, typename Tsrc>
-inline Tdst buffer_cast(Tsrc src)
-{
-	return buffer_cast_impl<Tdst, Tsrc>()(src);
-}
-
-
-
-template <typename T>
-struct GetRawBytesFunctor<std::vector<T>>
-{
-	inline mpt::const_byte_span operator () (const std::vector<T> & v) const
-	{
-		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
-		return mpt::as_span(reinterpret_cast<const std::byte *>(v.data()), v.size() * sizeof(T));
-	}
-	inline mpt::byte_span operator () (std::vector<T> & v) const
-	{
-		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
-		return mpt::as_span(reinterpret_cast<std::byte *>(v.data()), v.size() * sizeof(T));
-	}
-};
-
-template <typename T>
-struct GetRawBytesFunctor<const std::vector<T>>
-{
-	inline mpt::const_byte_span operator () (const std::vector<T> & v) const
-	{
-		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
-		return mpt::as_span(reinterpret_cast<const std::byte *>(v.data()), v.size() * sizeof(T));
-	}
-};
-
-
-
-} // namespace mpt
-
-
-
 #if defined(MPT_ENABLE_ALIGNED_ALLOC)
 
 
Index: common/mptBaseMacros.h
===================================================================
--- common/mptBaseMacros.h	(revision 14628)
+++ common/mptBaseMacros.h	(working copy)
@@ -12,8 +12,10 @@
 
 #include "BuildSettings.h"
 
+#include "mpt/base/preprocessor.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+#include "mpt/base/macros.hpp"
 
-
 #if MPT_CXX_AT_LEAST(20)
 #include <version>
 #else // !C++20
@@ -31,155 +33,20 @@
 #include <stdint.h>
 
 
-
 OPENMPT_NAMESPACE_BEGIN
 
 
 
-#define MPT_PP_DEFER(m, ...) m(__VA_ARGS__)
-
-#define MPT_PP_STRINGIFY(x) #x
-
-#define MPT_PP_JOIN_HELPER(a, b) a ## b
-#define MPT_PP_JOIN(a, b) MPT_PP_JOIN_HELPER(a, b)
-
-#define MPT_PP_UNIQUE_IDENTIFIER(prefix) MPT_PP_JOIN(prefix , __LINE__)
-
-
-
-#if MPT_COMPILER_MSVC
-
-#define MPT_WARNING(text)           __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
-#define MPT_WARNING_STATEMENT(text) __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
-
-#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
-
-#define MPT_WARNING(text)           _Pragma(MPT_PP_STRINGIFY(GCC warning text))
-#define MPT_WARNING_STATEMENT(text) _Pragma(MPT_PP_STRINGIFY(GCC warning text))
-
-#else
-
-// portable #pragma message or #warning replacement
-#define MPT_WARNING(text) \
-	static inline int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME) () noexcept { \
-		int warning [[deprecated("Warning: " text)]] = 0; \
-		return warning; \
-	} \
-/**/
-#define MPT_WARNING_STATEMENT(text) \
-	int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME) = [](){ \
-		int warning [[deprecated("Warning: " text)]] = 0; \
-		return warning; \
-	}() \
-/**/
-
-#endif
-
-
-
-// Advanced inline attributes
-#if MPT_COMPILER_MSVC
-#define MPT_FORCEINLINE __forceinline
-#define MPT_NOINLINE    __declspec(noinline)
-#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
-#define MPT_FORCEINLINE __attribute__((always_inline)) inline
-#define MPT_NOINLINE    __attribute__((noinline))
-#else
-#define MPT_FORCEINLINE inline
-#define MPT_NOINLINE
-#endif
-
-
-
-// constexpr
 #define MPT_CONSTEXPRINLINE constexpr MPT_FORCEINLINE
-#if MPT_CXX_AT_LEAST(20)
-#define MPT_CONSTEXPR20_FUN constexpr MPT_FORCEINLINE
-#define MPT_CONSTEXPR20_VAR constexpr
-#else // !C++20
-#define MPT_CONSTEXPR20_FUN MPT_FORCEINLINE
-#define MPT_CONSTEXPR20_VAR const
-#endif // C++20
 
 
 
-#define MPT_FORCE_CONSTEXPR(expr) [&]() { \
-  constexpr auto x = (expr); \
-  return x; \
-}()
+#define MPT_UNREFERENCED_PARAMETER(x) MPT_UNUSED(x)
+#define MPT_UNUSED_VARIABLE(x) MPT_UNUSED(x)
 
 
 
-#if MPT_CXX_AT_LEAST(20)
-#define MPT_IS_CONSTANT_EVALUATED20() std::is_constant_evaluated()
-#define MPT_IS_CONSTANT_EVALUATED() std::is_constant_evaluated()
-#else // !C++20
-#define MPT_IS_CONSTANT_EVALUATED20() false
-#define MPT_IS_CONSTANT_EVALUATED() true // this pessimizes the case for C++17 by always assuming constexpr context, which implies always running constexpr-friendly code
-#endif // C++20
-
-
-
-// Use MPT_RESTRICT to indicate that a pointer is guaranteed to not be aliased.
-#if MPT_COMPILER_MSVC || MPT_COMPILER_GCC || MPT_COMPILER_CLANG
-#define MPT_RESTRICT __restrict
-#else
-#define MPT_RESTRICT
-#endif
-
-
-
-#define MPT_DISCARD(expr) static_cast<void>(expr)
-
-
-
 #if MPT_COMPILER_MSVC
-#define MPT_MAYBE_CONSTANT_IF(x) \
-  __pragma(warning(push)) \
-  __pragma(warning(disable:4127)) \
-  if(x) \
-  __pragma(warning(pop)) \
-/**/
-#endif
-
-#if MPT_COMPILER_GCC
-#define MPT_MAYBE_CONSTANT_IF(x) \
-  _Pragma("GCC diagnostic push") \
-  _Pragma("GCC diagnostic ignored \"-Wtype-limits\"") \
-  if(x) \
-  _Pragma("GCC diagnostic pop") \
-/**/
-#endif
-
-#if MPT_COMPILER_CLANG
-#define MPT_MAYBE_CONSTANT_IF(x) \
-  _Pragma("clang diagnostic push") \
-  _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") \
-  _Pragma("clang diagnostic ignored \"-Wtype-limits\"") \
-  _Pragma("clang diagnostic ignored \"-Wtautological-constant-out-of-range-compare\"") \
-  if(x) \
-  _Pragma("clang diagnostic pop") \
-/**/
-#endif
-
-#if !defined(MPT_MAYBE_CONSTANT_IF)
-// MPT_MAYBE_CONSTANT_IF disables compiler warnings for conditions that may in some case be either always false or always true (this may turn out to be useful in ASSERTions in some cases).
-#define MPT_MAYBE_CONSTANT_IF(x) if(x)
-#endif
-
-
-
-#if MPT_COMPILER_MSVC && defined(UNREFERENCED_PARAMETER)
-#define MPT_UNREFERENCED_PARAMETER(x) UNREFERENCED_PARAMETER(x)
-#else
-#define MPT_UNREFERENCED_PARAMETER(x) (void)(x)
-#endif
-
-#define MPT_UNUSED_VARIABLE(x) MPT_UNREFERENCED_PARAMETER(x)
-
-
-
-#if MPT_COMPILER_MSVC
 // warning LNK4221: no public symbols found; archive member will be inaccessible
 // There is no way to selectively disable linker warnings.
 // #pragma warning does not apply and a command line option does not exist.
Index: common/mptBaseTypes.h
===================================================================
--- common/mptBaseTypes.h	(revision 14628)
+++ common/mptBaseTypes.h	(working copy)
@@ -13,14 +13,16 @@
 #include "BuildSettings.h"
 
 
+#include "mpt/base/integer.hpp"
+#include "mpt/base/floatingpoint.hpp"
+#include "mpt/base/pointer.hpp"
+#include "mpt/base/check_platform.hpp"
+#include "mpt/base/source_location.hpp"
 
 #include "mptBaseMacros.h"
 
 #include <array>
 #include <limits>
-#if MPT_CXX_AT_LEAST(20)
-#include <source_location>
-#endif // C++20
 #include <type_traits>
 
 #include <cstddef>
@@ -33,16 +35,15 @@
 OPENMPT_NAMESPACE_BEGIN
 
 
+using int8   = mpt::int8;
+using int16  = mpt::int16;
+using int32  = mpt::int32;
+using int64  = mpt::int64;
+using uint8  = mpt::uint8;
+using uint16 = mpt::uint16;
+using uint32 = mpt::uint32;
+using uint64 = mpt::uint64;
 
-using int8   = std::int8_t;
-using int16  = std::int16_t;
-using int32  = std::int32_t;
-using int64  = std::int64_t;
-using uint8  = std::uint8_t;
-using uint16 = std::uint16_t;
-using uint32 = std::uint32_t;
-using uint64 = std::uint64_t;
-
 constexpr inline int8 int8_min     = std::numeric_limits<int8>::min();
 constexpr inline int16 int16_min   = std::numeric_limits<int16>::min();
 constexpr inline int32 int32_min   = std::numeric_limits<int32>::min();
@@ -60,236 +61,11 @@
 
 
 
-// fp half
-// n/a
+using nativefloat = mpt::nativefloat;
+using float32 = mpt::float32;
+using float64 = mpt::float64;
+using namespace mpt::float_literals;
 
-// fp single
-using single = float;
-constexpr single operator"" _fs(long double lit) noexcept
-{
-	return static_cast<single>(lit);
-}
 
-// fp double
-constexpr double operator"" _fd(long double lit) noexcept
-{
-	return static_cast<double>(lit);
-}
 
-// fp extended
-constexpr long double operator"" _fe(long double lit) noexcept
-{
-	return static_cast<long double>(lit);
-}
-
-// fp quad
-// n/a
-
-using float32 = std::conditional<sizeof(float) == 4,
-		float
-	,
-		std::conditional<sizeof(double) == 4,
-			double
-		,
-      std::conditional<sizeof(long double) == 4,
-				long double
-			,
-				float
-			>::type
-		>::type
-	>::type;
-constexpr float32 operator"" _f32(long double lit) noexcept
-{
-	return static_cast<float32>(lit);
-}
-
-using float64 = std::conditional<sizeof(float) == 8,
-		float
-	,
-		std::conditional<sizeof(double) == 8,
-			double
-		,
-      std::conditional<sizeof(long double) == 8,
-				long double
-			,
-				double
-			>::type
-		>::type
-	>::type;
-constexpr float64 operator"" _f64(long double lit) noexcept
-{
-	return static_cast<float64>(lit);
-}
-
-namespace mpt
-{
-template <typename T>
-struct float_traits
-{
-	static constexpr bool is_float = !std::numeric_limits<T>::is_integer;
-	static constexpr bool is_hard = is_float && !MPT_COMPILER_QUIRK_FLOAT_EMULATED;
-	static constexpr bool is_soft = is_float && MPT_COMPILER_QUIRK_FLOAT_EMULATED;
-	static constexpr bool is_float32 = is_float && (sizeof(T) == 4);
-	static constexpr bool is_float64 = is_float && (sizeof(T) == 8);
-	static constexpr bool is_native_endian = is_float && !MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN;
-	static constexpr bool is_ieee754_binary = is_float && std::numeric_limits<T>::is_iec559 && !MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754;
-	static constexpr bool is_ieee754_binary32 = is_float && is_ieee754_binary && is_float32;
-	static constexpr bool is_ieee754_binary64 = is_float && is_ieee754_binary && is_float64;
-	static constexpr bool is_ieee754_binary32ne = is_float && is_ieee754_binary && is_float32 && is_native_endian;
-	static constexpr bool is_ieee754_binary64ne = is_float && is_ieee754_binary && is_float64 && is_native_endian;
-	static constexpr bool is_preferred = is_float && ((is_float32 && MPT_COMPILER_QUIRK_FLOAT_PREFER32) || (is_float64 && MPT_COMPILER_QUIRK_FLOAT_PREFER64));
-};
-}  // namespace mpt
-
-// prefer smaller floats, but try to use IEEE754 floats
-using nativefloat =
-	std::conditional<mpt::float_traits<float32>::is_preferred,
-		float32
-	,
-		std::conditional<mpt::float_traits<float64>::is_preferred,
-			float64
-		,
-			std::conditional<std::numeric_limits<float>::is_iec559,
-				float
-			,
-				std::conditional<std::numeric_limits<double>::is_iec559,
-					double
-				,
-					std::conditional<std::numeric_limits<long double>::is_iec559,
-						long double
-					,
-						float
-					>::type
-				>::type
-			>::type
-		>::type
-	>::type;
-constexpr nativefloat operator"" _nf(long double lit) noexcept
-{
-	return static_cast<nativefloat>(lit);
-}
-
-
-
-static_assert(sizeof(std::uintptr_t) == sizeof(void*));
-
-
-
-static_assert(std::numeric_limits<unsigned char>::digits == 8);
-
-static_assert(sizeof(char) == 1);
-
-static_assert(sizeof(std::byte) == 1);
-static_assert(alignof(std::byte) == 1);
-
-
-namespace mpt {
-inline constexpr int arch_bits = sizeof(void*) * 8;
-inline constexpr std::size_t pointer_size = sizeof(void*);
-} // namespace mpt
-
-static_assert(mpt::arch_bits == static_cast<int>(mpt::pointer_size) * 8);
-
-
-
-namespace mpt
-{
-
-#if MPT_CXX_AT_LEAST(20)
-
-using std::source_location;
-
-#define MPT_SOURCE_LOCATION_CURRENT() std::source_location::current()
-
-#else // !C++20
-
-#if MPT_COMPILER_MSVC && MPT_MSVC_AT_LEAST(2019,6)
-
-#define MPT_SOURCE_LOCATION_FILE __builtin_FILE()
-#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
-#define MPT_SOURCE_LOCATION_LINE __builtin_LINE()
-#define MPT_SOURCE_LOCATION_COLUMN __builtin_COLUMN()
-
-#elif MPT_COMPILER_GCC
-
-#define MPT_SOURCE_LOCATION_FILE __builtin_FILE()
-#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
-#define MPT_SOURCE_LOCATION_LINE __builtin_LINE()
-#define MPT_SOURCE_LOCATION_COLUMN 0
-
-#elif MPT_COMPILER_CLANG && MPT_CLANG_AT_LEAST(9,0,0)
-
-#define MPT_SOURCE_LOCATION_FILE __builtin_FILE()
-#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
-#define MPT_SOURCE_LOCATION_LINE __builtin_LINE()
-#define MPT_SOURCE_LOCATION_COLUMN __builtin_COLUMN()
-
-#else
-
-#define MPT_SOURCE_LOCATION_FILE __FILE__
-#define MPT_SOURCE_LOCATION_FUNCTION ""
-#define MPT_SOURCE_LOCATION_LINE __LINE__
-#define MPT_SOURCE_LOCATION_COLUMN 0
-
-#endif
-
-// compatible with std::experimental::source_location from Library Fundamentals TS v2.
-struct source_location
-{
-private:
-	const char* m_file_name;
-	const char* m_function_name;
-	uint32 m_line;
-	uint32 m_column;
-public:
-	constexpr source_location() noexcept
-		: m_file_name("")
-		, m_function_name("")
-		, m_line(0)
-		, m_column(0)
-	{
-	}
-	constexpr source_location(const char* file, const char* function, uint32 line, uint32 column) noexcept
-		: m_file_name(file)
-		, m_function_name(function)
-		, m_line(line)
-		, m_column(column)
-	{
-	}
-	source_location(const source_location&) = default;
-	source_location(source_location&&) = default;
-	static constexpr source_location current(const char * file = MPT_SOURCE_LOCATION_FILE, const char * function = MPT_SOURCE_LOCATION_FUNCTION, uint32 line = MPT_SOURCE_LOCATION_LINE, uint32 column = MPT_SOURCE_LOCATION_COLUMN) noexcept
-	{
-		return source_location(file, function, line, column);
-	}
-	constexpr uint32 line() const noexcept
-	{
-		return m_line;
-	}
-	constexpr uint32 column() const noexcept
-	{
-		return m_column;
-	}
-	constexpr const char* file_name() const noexcept
-	{
-		return m_file_name;
-	}
-	constexpr const char* function_name() const noexcept
-	{
-		return m_function_name;
-	}
-};
-
-#if (MPT_COMPILER_MSVC && MPT_MSVC_AT_LEAST(2019,6)) || MPT_COMPILER_GCC || (MPT_COMPILER_CLANG && MPT_CLANG_AT_LEAST(9,0,0))
-#define MPT_SOURCE_LOCATION_CURRENT() mpt::source_location::current()
-#else
-#define MPT_SOURCE_LOCATION_CURRENT() mpt::source_location::current( __FILE__ , __func__ , __LINE__ , 0 )
-#endif
-
-#endif // C++20
-
-} // namespace mpt
-
-
-
 OPENMPT_NAMESPACE_END
Index: common/mptBaseUtils.h
===================================================================
--- common/mptBaseUtils.h	(revision 14628)
+++ common/mptBaseUtils.h	(working copy)
@@ -13,13 +13,22 @@
 #include "BuildSettings.h"
 
 
+#include "mpt/base/algorithm.hpp"
+#include "mpt/base/arithmetic_shift.hpp"
+#include "mpt/base/array.hpp"
+#include "mpt/base/bit.hpp"
+#include "mpt/base/constexpr_throw.hpp"
+#include "mpt/base/math.hpp"
+#include "mpt/base/numeric.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/base/saturate_round.hpp"
+#include "mpt/base/utility.hpp"
+#include "mpt/base/wrapping_divide.hpp"
+
 #include "mptBaseMacros.h"
 #include "mptBaseTypes.h"
 
 #include <algorithm>
-#if MPT_CXX_AT_LEAST(20)
-#include <bit>
-#endif
 #include <limits>
 #include <numeric>
 #include <utility>
@@ -52,512 +61,9 @@
 #endif
 
 
-
-namespace mpt
-{
-
-template <typename T>
-struct stdarray_extent : std::integral_constant<std::size_t, 0> {};
-
-template <typename T, std::size_t N>
-struct stdarray_extent<std::array<T, N>> : std::integral_constant<std::size_t, N> {};
-
-template <typename T>
-struct is_stdarray : std::false_type {};
-
-template <typename T, std::size_t N>
-struct is_stdarray<std::array<T, N>> : std::true_type {};
-
-// mpt::extent is the same as std::extent,
-// but also works for std::array,
-// and asserts that the given type is actually an array type instead of returning 0.
-// use as:
-// mpt::extent<decltype(expr)>()
-// mpt::extent<decltype(variable)>()
-// mpt::extent<decltype(type)>()
-// mpt::extent<type>()
-template <typename T>
-constexpr std::size_t extent() noexcept
-{
-	using Tarray = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
-	static_assert(std::is_array<Tarray>::value || mpt::is_stdarray<Tarray>::value);
-	if constexpr(mpt::is_stdarray<Tarray>::value)
-	{
-		return mpt::stdarray_extent<Tarray>();
-	} else
-	{
-		return std::extent<Tarray>();
-	}
-}
-
-template<typename>
-struct array_size;
-
-template <typename T, std::size_t N>
-struct array_size<std::array<T, N>>
-{
-	static constexpr std::size_t size = N;
-};
-
-template <typename T, std::size_t N>
-struct array_size<T[N]>
-{
-	static constexpr std::size_t size = N;
-};
-
-} // namespace mpt
-
-
-
-namespace mpt
-{
-
-template <typename T, std::size_t N, typename Tx>
-constexpr std::array<T, N> init_array(const Tx & x)
-{
-	std::array<T, N> result{};
-	for(std::size_t i = 0; i < N; ++i)
-	{
-		result[i] = x;
-	}
-	return result;
-}
-
-} // namespace mpt
-
-
-
-namespace mpt
-{
-
-#if MPT_CXX_AT_LEAST(23)
-
-using std::to_underlying;
-
-#else // !C++23
-
-template <typename T>
-constexpr std::underlying_type_t<T> to_underlying(T value) noexcept
-{
-	return static_cast<typename std::underlying_type<T>::type>(value);
-}
-
-#endif // C++23
-
-} // namespace mpt
-
-
-namespace mpt
-{
-
-// Work-around for the requirement of at least 1 non-throwing function argument combination in C++ (17,2a).
-
-template <typename Exception>
-constexpr bool constexpr_throw_helper(Exception && e, bool really = true)
-{
-	//return !really ? really : throw std::forward<Exception>(e);
-	if(really)
-	{
-		throw std::forward<Exception>(e);
-	}
-	// cppcheck-suppress identicalConditionAfterEarlyExit
-	return really;
-}
-template <typename Exception>
-constexpr bool constexpr_throw(Exception && e)
-{
-	return mpt::constexpr_throw_helper(std::forward<Exception>(e));
-}
-
-template <typename T, typename Exception>
-constexpr T constexpr_throw_helper(Exception && e, bool really = true)
-{
-	//return !really ? really : throw std::forward<Exception>(e);
-	if(really)
-	{
-		throw std::forward<Exception>(e);
-	}
-	return T{};
-}
-template <typename T, typename Exception>
-constexpr T constexpr_throw(Exception && e)
-{
-	return mpt::constexpr_throw_helper<T>(std::forward<Exception>(e));
-}
-
-}  // namespace mpt
-
-
-
-namespace mpt {
-
-// Modulo with more intuitive behaviour for some contexts:
-// Instead of being symmetrical around 0, the pattern for positive numbers is repeated in the negative range.
-// For example, wrapping_modulo(-1, m) == (m - 1).
-// Behaviour is undefined if m<=0.
-template<typename T, typename M>
-constexpr auto wrapping_modulo(T x, M m) -> decltype(x % m)
-{
-	return (x >= 0) ? (x % m) : (m - 1 - ((-1 - x) % m));
-}
-
-template<typename T, typename D>
-constexpr auto wrapping_divide(T x, D d) -> decltype(x / d)
-{
-	return (x >= 0) ? (x / d) : (((x + 1) / d) - 1);
-}
-
-} // namespace mpt
-
-
-
-namespace mpt {
-
-
-
-// Saturate the value of src to the domain of Tdst
-template <typename Tdst, typename Tsrc>
-constexpr Tdst saturate_cast(Tsrc src) noexcept
-{
-	// This code tries not only to obviously avoid overflows but also to avoid signed/unsigned comparison warnings and type truncation warnings (which in fact would be safe here) by explicit casting.
-	static_assert(std::numeric_limits<Tdst>::is_integer);
-	static_assert(std::numeric_limits<Tsrc>::is_integer);
-	if constexpr(std::numeric_limits<Tdst>::is_signed && std::numeric_limits<Tsrc>::is_signed)
-	{
-		if constexpr(sizeof(Tdst) >= sizeof(Tsrc))
-		{
-			return static_cast<Tdst>(src);
-		} else
-		{
-			return static_cast<Tdst>(std::max(static_cast<Tsrc>(std::numeric_limits<Tdst>::min()), std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))));
-		}
-	} else if constexpr(!std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed)
-	{
-		if constexpr(sizeof(Tdst) >= sizeof(Tsrc))
-		{
-			return static_cast<Tdst>(src);
-		} else
-		{
-			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
-		}
-	} else if constexpr(std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed)
-	{
-		if constexpr(sizeof(Tdst) > sizeof(Tsrc))
-		{
-			return static_cast<Tdst>(src);
-		} else if constexpr(sizeof(Tdst) == sizeof(Tsrc))
-		{
-			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
-		} else
-		{
-			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
-		}
-	} else // Tdst unsigned, Tsrc signed
-	{
-		if constexpr(sizeof(Tdst) >= sizeof(Tsrc))
-		{
-			return static_cast<Tdst>(std::max(static_cast<Tsrc>(0), src));
-		} else
-		{
-			return static_cast<Tdst>(std::max(static_cast<Tsrc>(0), std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))));
-		}
-	}
-}
-
-template <typename Tdst>
-constexpr Tdst saturate_cast(double src)
-{
-	if(src >= static_cast<double>(std::numeric_limits<Tdst>::max()))
-	{
-		return std::numeric_limits<Tdst>::max();
-	}
-	if(src <= static_cast<double>(std::numeric_limits<Tdst>::min()))
-	{
-		return std::numeric_limits<Tdst>::min();
-	}
-	return static_cast<Tdst>(src);
-}
-
-template <typename Tdst>
-constexpr Tdst saturate_cast(float src)
-{
-	if(src >= static_cast<float>(std::numeric_limits<Tdst>::max()))
-	{
-		return std::numeric_limits<Tdst>::max();
-	}
-	if(src <= static_cast<float>(std::numeric_limits<Tdst>::min()))
-	{
-		return std::numeric_limits<Tdst>::min();
-	}
-	return static_cast<Tdst>(src);
-}
-
-
-#if MPT_CXX_AT_LEAST(20)
-
-using std::popcount;
-using std::has_single_bit;
-using std::bit_ceil;
-using std::bit_floor;
-using std::bit_width;
-using std::countl_zero;
-using std::countl_one;
-using std::countr_zero;
-using std::countr_one;
-using std::rotl;
-using std::rotr;
-
-#else
-
-// C++20 <bit> header.
-// Note that we do not use SFINAE here but instead rely on static_assert.
-
-template <typename T>
-constexpr int popcount(T val) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	int result = 0;
-	while(val > 0)
-	{
-		if(val & 0x1)
-		{
-			result++;
-		}
-		val >>= 1;
-	}
-	return result;
-}
-
-template <typename T>
-constexpr bool has_single_bit(T x) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	return mpt::popcount(x) == 1;
-}
-
-template <typename T>
-constexpr T bit_ceil(T x) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	T result = 1;
-	while(result < x)
-	{
-		T newresult = result << 1;
-		if(newresult < result)
-		{
-			return 0;
-		}
-		result = newresult;
-	}
-	return result;
-}
-
-template <typename T>
-constexpr T bit_floor(T x) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	if(x == 0)
-	{
-		return 0;
-	}
-	T result = 1;
-	do
-	{
-		T newresult = result << 1;
-		if(newresult < result)
-		{
-			return result;
-		}
-		result = newresult;
-	} while(result <= x);
-	return result >> 1;
-}
- 
-template <typename T>
-constexpr T bit_width(T x) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	T result = 0;
-	while(x > 0)
-	{
-		x >>= 1;
-		result += 1;
-	}
-	return result;
-}
-
-template <typename T>
-constexpr int countl_zero(T x) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	int count = 0;
-	for(int bit = std::numeric_limits<T>::digits - 1; bit >= 0; --bit)
-	{
-		if((x & (1u<<bit)) == 0u)
-		{
-			count++;
-		} else
-		{
-			break;
-		}
-	}
-	return count;
-}
-
-template <typename T>
-constexpr int countl_one(T x) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	int count = 0;
-	for(int bit = std::numeric_limits<T>::digits - 1; bit >= 0; --bit)
-	{
-		if((x & (1u<<bit)) != 0u)
-		{
-			count++;
-		} else
-		{
-			break;
-		}
-	}
-	return count;
-}
-
-template <typename T>
-constexpr int countr_zero(T x) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	int count = 0;
-	for(int bit = 0; bit < std::numeric_limits<T>::digits; ++bit)
-	{
-		if((x & (1u<<bit)) == 0u)
-		{
-			count++;
-		} else
-		{
-			break;
-		}
-	}
-	return count;
-}
-
-template <typename T>
-constexpr int countr_one(T x) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	int count = 0;
-	for(int bit = 0; bit < std::numeric_limits<T>::digits; ++bit)
-	{
-		if((x & (1u<<bit)) != 0u)
-		{
-			count++;
-		} else
-		{
-			break;
-		}
-	}
-	return count;
-}
-
-namespace detail
-{
-
-template <typename T>
-constexpr T rotl(T x, int r) noexcept
-{
-	auto N = std::numeric_limits<T>::digits;
-	return (x >> (N - r)) | (x << r);
-}
-
-template <typename T>
-constexpr T rotr(T x, int r) noexcept
-{
-	auto N = std::numeric_limits<T>::digits;
-	return (x << (N - r)) | (x >> r);
-}
-
-} // namespace detail
-
-template <typename T>
-constexpr T rotl(T x, int s) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	auto N = std::numeric_limits<T>::digits;
-	auto r = s % N;
-	return (s < 0) ? detail::rotr(x, -s) : ((x >> (N - r)) | (x << r));
-}
-
-template <typename T>
-constexpr T rotr(T x, int s) noexcept
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::is_unsigned<T>::value);
-	auto N = std::numeric_limits<T>::digits;
-	auto r = s % N;
-	return (s < 0) ? detail::rotl(x, -s) : ((x << (N - r)) | (x >> r));
-}
-
-#endif
-
-#if MPT_CXX_AT_LEAST(20)
-
-using std::in_range;
-
-#else
-
-// Returns true iff Tdst can represent the value val.
-// Use as if(mpt::in_range<uint8>(-1)).
-template <typename Tdst, typename Tsrc>
-constexpr bool in_range(Tsrc val)
-{
-	return (static_cast<Tsrc>(mpt::saturate_cast<Tdst>(val)) == val);
-}
-
-#endif
-
-} // namespace mpt
-
-
 namespace Util
 {
 
-namespace detail
-{
-template <typename Tmod, Tmod m>
-struct ModIfNotZeroImpl
-{
-	template <typename Tval>
-	constexpr Tval mod(Tval x)
-	{
-		static_assert(std::numeric_limits<Tmod>::is_integer);
-		static_assert(!std::numeric_limits<Tmod>::is_signed);
-		static_assert(std::numeric_limits<Tval>::is_integer);
-		static_assert(!std::numeric_limits<Tval>::is_signed);
-		return static_cast<Tval>(x % m);
-	}
-};
-template <> struct ModIfNotZeroImpl<uint8 , 0> { template <typename Tval> constexpr Tval mod(Tval x) { return x; } };
-template <> struct ModIfNotZeroImpl<uint16, 0> { template <typename Tval> constexpr Tval mod(Tval x) { return x; } };
-template <> struct ModIfNotZeroImpl<uint32, 0> { template <typename Tval> constexpr Tval mod(Tval x) { return x; } };
-template <> struct ModIfNotZeroImpl<uint64, 0> { template <typename Tval> constexpr Tval mod(Tval x) { return x; } };
-} // namespace detail
-// Returns x % m if m != 0, x otherwise.
-// i.e. "return (m == 0) ? x : (x % m);", but without causing a warning with stupid older compilers
-template <typename Tmod, Tmod m, typename Tval>
-constexpr Tval ModIfNotZero(Tval x)
-{
-	return detail::ModIfNotZeroImpl<Tmod, m>().mod(x);
-}
-
 // Grows x with an exponential factor suitable for increasing buffer sizes.
 // Clamps the result at limit.
 // And avoids integer overflows while doing its business.
@@ -567,12 +73,7 @@
 {
 	MPT_ASSERT(x > 0);
 	MPT_ASSERT(limit > 0);
-	if(x == 1)
-	{
-		return 2;
-	}
-	T add = std::min(x >> 1, std::numeric_limits<T>::max() - x);
-	return std::min(x + add, mpt::saturate_cast<T>(limit));
+	return mpt::exponential_grow(x, limit);
 }
 									
 template <typename T>
@@ -611,7 +112,7 @@
 template<typename T, typename C>
 inline bool IsInRange(T val, C lo, C hi)
 {
-	return lo <= val && val <= hi;
+	return mpt::is_in_range(val, lo, hi);
 }
 
 // Like Limit, but with upperlimit only.
@@ -632,96 +133,6 @@
 
 
 
-// mpt::rshift_signed
-// mpt::lshift_signed
-// Shift a signed integer value in a well-defined manner.
-// Does the same thing as MSVC would do. This is verified by the test suite.
-
-namespace mpt
-{
-
-template <typename T>
-constexpr auto rshift_signed_standard(T x, int y) noexcept -> decltype(x >> y)
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::numeric_limits<T>::is_signed);
-	typedef decltype(x >> y) result_type;
-	typedef typename std::make_unsigned<result_type>::type unsigned_result_type;
-	const unsigned_result_type roffset = static_cast<unsigned_result_type>(1) << ((sizeof(result_type) * 8) - 1);
-	result_type rx = x;
-	unsigned_result_type urx = static_cast<unsigned_result_type>(rx);
-	urx += roffset;
-	urx >>= y;
-	urx -= roffset >> y;
-	return static_cast<result_type>(urx);
-}
-
-template <typename T>
-constexpr auto lshift_signed_standard(T x, int y) noexcept -> decltype(x << y)
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::numeric_limits<T>::is_signed);
-	typedef decltype(x << y) result_type;
-	typedef typename std::make_unsigned<result_type>::type unsigned_result_type;
-	const unsigned_result_type roffset = static_cast<unsigned_result_type>(1) << ((sizeof(result_type) * 8) - 1);
-	result_type rx = x;
-	unsigned_result_type urx = static_cast<unsigned_result_type>(rx);
-	urx += roffset;
-	urx <<= y;
-	urx -= roffset << y;
-	return static_cast<result_type>(urx);
-}
-
-#if MPT_COMPILER_SHIFT_SIGNED
-
-template <typename T>
-constexpr auto rshift_signed_undefined(T x, int y) noexcept -> decltype(x >> y)
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::numeric_limits<T>::is_signed);
-	return x >> y;
-}
-
-template <typename T>
-constexpr auto lshift_signed_undefined(T x, int y) noexcept -> decltype(x << y)
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	static_assert(std::numeric_limits<T>::is_signed);
-	return x << y;
-}
-
-template <typename T>
-constexpr auto rshift_signed(T x, int y) noexcept -> decltype(x >> y)
-{
-	return mpt::rshift_signed_undefined(x, y);
-}
-
-template <typename T>
-constexpr auto lshift_signed(T x, int y) noexcept -> decltype(x << y)
-{
-	return mpt::lshift_signed_undefined(x, y);
-}
-
-#else
-
-template <typename T>
-constexpr auto rshift_signed(T x, int y) noexcept -> decltype(x >> y)
-{
-	return mpt::rshift_signed_standard(x, y);
-}
-
-template <typename T>
-constexpr auto lshift_signed(T x, int y) noexcept -> decltype(x << y)
-{
-	return mpt::lshift_signed_standard(x, y);
-}
-
-#endif
-
-}  // namespace mpt
-
-
-
 namespace Util
 {
 
@@ -730,39 +141,8 @@
 
 }  // namespace Util
 
-namespace mpt
-{
 
-#if MPT_OS_DJGPP
 
-	inline double round(const double& val) { return ::round(val); }
-	inline float round(const float& val) { return ::roundf(val); }
-
-#else // !MPT_OS_DJGPP
-
-	// C++11 std::round
-	using std::round;
-
-#endif // MPT_OS_DJGPP
-
-
-	// Rounds given double value to nearest integer value of type T.
-	// Out-of-range values are saturated to the specified integer type's limits.
-	template <class T> inline T saturate_round(double val)
-	{
-		static_assert(std::numeric_limits<T>::is_integer == true, "Type is a not an integer");
-		return mpt::saturate_cast<T>(mpt::round(val));
-	}
-
-	template <class T> inline T saturate_round(float val)
-	{
-		static_assert(std::numeric_limits<T>::is_integer == true, "Type is a not an integer");
-		return mpt::saturate_cast<T>(mpt::round(val));
-	}
-
-}
-
-
 namespace Util {
 
 	// Multiply two 32-bit integers, receive 64-bit result.
@@ -828,7 +208,7 @@
 	template <typename T>
 	constexpr T AlignUp(T x, T target)
 	{
-		return ((x + (target - 1)) / target) * target;
+		return mpt::align_up(x, target);
 	}
 
 	// rounds x down to multiples of target
@@ -835,22 +215,11 @@
 	template <typename T>
 	constexpr T AlignDown(T x, T target)
 	{
-		return (x / target) * target;
+		return mpt::align_down(x, target);
 	}
 
 } // namespace Util
 
 
-namespace mpt
-{
 
-template <typename TContainer, typename TVal>
-MPT_CONSTEXPR20_FUN bool contains(const TContainer &container, const TVal &value) noexcept(noexcept(std::find(std::begin(container), std::end(container), value)))
-{
-	return std::find(std::begin(container), std::end(container), value) != std::end(container);
-}
-
-}  // namespace mpt
-
-
 OPENMPT_NAMESPACE_END
Index: common/mptCRC.h
===================================================================
--- common/mptCRC.h	(revision 14628)
+++ common/mptCRC.h	(working copy)
@@ -11,235 +11,4 @@
 
 #include "BuildSettings.h"
 
-#include <array>
-
-OPENMPT_NAMESPACE_BEGIN
-
-namespace mpt
-{
-
-namespace checksum
-{
-
-template <typename T, T polynomial, T initial, T resultXOR, bool reverseData>
-class crc
-{
-
-public:
-	
-	typedef crc self_type;
-	typedef T value_type;
-	typedef uint8 byte_type;
-
-	static constexpr std::size_t size_bytes = sizeof(value_type);
-	static constexpr std::size_t size_bits = sizeof(value_type) * 8;
-	static constexpr value_type top_bit = static_cast<value_type>(1) << ((sizeof(value_type) * 8) - 1);
-
-private:
-	
-	template <typename Tint>
-	static constexpr Tint reverse(Tint value) noexcept
-	{
-		const std::size_t bits = sizeof(Tint) * 8;
-		Tint result = 0;
-		for(std::size_t i = 0; i < bits; ++i)
-		{
-			result <<= 1;
-			result |= static_cast<Tint>(value & 0x1);
-			value >>= 1;
-		}
-		return result;
-	}
-
-	static constexpr value_type calculate_table_entry(byte_type pos) noexcept
-	{
-		value_type value = 0;
-		value = (static_cast<value_type>(reverseData ? reverse(pos) : pos) << (size_bits - 8));
-		for(std::size_t bit = 0; bit < 8; ++bit)
-		{
-			if(value & top_bit)
-			{
-				value = (value << 1) ^ polynomial;
-			} else
-			{
-				value = (value << 1);
-			}
-		}
-		value = (reverseData ? reverse(value) : value);
-		return value;
-	}
-
-private:
-
-	static constexpr std::array<value_type, 256> calculate_table() noexcept
-	{
-		std::array<value_type, 256> t = mpt::init_array<value_type, 256>(value_type{});
-		for(std::size_t i = 0; i < 256; ++i)
-		{
-			t[i] = calculate_table_entry(static_cast<byte_type>(i));
-		}
-		return t;
-	}
-
-	static constexpr std::array<value_type, 256> table = calculate_table();
-	
-private:
-
-	constexpr value_type read_table(byte_type pos) const noexcept
-	{
-		return table[pos];
-	}
-
-private:
-
-	value_type value;
-
-public:
-
-	constexpr crc() noexcept
-		: value(initial)
-	{
-		return;
-	}
-
-	constexpr void processByte(byte_type byte) noexcept
-	{
-		if constexpr(reverseData)
-		{
-			value = (value >> 8) ^ read_table(static_cast<byte_type>((value & 0xff) ^ byte));
-		} else
-		{
-			value = (value << 8) ^ read_table(static_cast<byte_type>(((value >> (size_bits - 8)) & 0xff) ^ byte));
-		}
-	}
-
-	constexpr value_type result() const noexcept
-	{
-		return (value ^ resultXOR);
-	}
-
-public:
-
-	constexpr operator value_type () const noexcept
-	{
-		return result();
-	}
-
-	inline crc & process(char c) noexcept
-	{
-		processByte(mpt::byte_cast<byte_type>(c));
-		return *this;
-	}
-
-	inline crc & process(signed char c) noexcept
-	{
-		processByte(static_cast<byte_type>(c));
-		return *this;
-	}
-
-	inline crc & process(unsigned char c) noexcept
-	{
-		processByte(mpt::byte_cast<byte_type>(c));
-		return *this;
-	}
-
-	inline crc & process(std::byte c) noexcept
-	{
-		processByte(mpt::byte_cast<byte_type>(c));
-		return *this;
-	}
-
-	template <typename InputIt>
-	inline crc & process(InputIt beg, InputIt end)
-	{
-		for(InputIt it = beg; it != end; ++it)
-		{
-			static_assert(sizeof(*it) == 1, "1 byte type required");
-			process(*it);
-		}
-		return *this;
-	}
-
-	template <typename Container>
-	inline crc & process(const Container &data)
-	{
-		operator () (data.begin(), data.end());
-		return *this;
-	}
-
-	inline crc & operator () (char c) noexcept
-	{
-		processByte(mpt::byte_cast<byte_type>(c));
-		return *this;
-	}
-
-	inline crc & operator () (signed char c) noexcept
-	{
-		processByte(static_cast<byte_type>(c));
-		return *this;
-	}
-
-	inline crc & operator () (unsigned char c) noexcept
-	{
-		processByte(mpt::byte_cast<byte_type>(c));
-		return *this;
-	}
-
-	inline crc & operator () (std::byte c) noexcept
-	{
-		processByte(mpt::byte_cast<byte_type>(c));
-		return *this;
-	}
-
-	template <typename InputIt>
-	crc & operator () (InputIt beg, InputIt end)
-	{
-		for(InputIt it = beg; it != end; ++it)
-		{
-			static_assert(sizeof(*it) == 1, "1 byte type required");
-			operator () (*it);
-		}
-		return *this;
-	}
-
-	template <typename Container>
-	inline crc & operator () (const Container &data)
-	{
-		operator () (data.begin(), data.end());
-		return *this;
-	}
-
-	template <typename InputIt>
-	crc(InputIt beg, InputIt end)
-		: value(initial)
-	{
-		for(InputIt it = beg; it != end; ++it)
-		{
-			static_assert(sizeof(*it) == 1, "1 byte type required");
-			process(*it);
-		}
-	}
-
-	template <typename Container>
-	inline crc(const Container &data)
-		: value(initial)
-	{
-		process(data.begin(), data.end());
-	}
-
-};
-
-typedef crc<uint16, 0x8005, 0, 0, true> crc16;
-typedef crc<uint32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true> crc32;
-typedef crc<uint32, 0x04C11DB7, 0, 0, false> crc32_ogg;
-typedef crc<uint32, 0x1EDC6F41, 0xFFFFFFFF, 0xFFFFFFFF, true> crc32c;
-typedef crc<uint64, 0xAD93D23594C935A9ull, 0xFFFFFFFFFFFFFFFFull, 0, true> crc64_jones;
-
-} // namespace checksum
-
-using mpt::checksum::crc32;
-using mpt::checksum::crc32_ogg;
-
-} // namespace mpt
-
-OPENMPT_NAMESPACE_END
+#include "mpt/crc/crc.hpp"
Index: common/mptException.h
===================================================================
--- common/mptException.h	(revision 14628)
+++ common/mptException.h	(working copy)
@@ -7,85 +7,8 @@
  * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
  */
 
-
 #pragma once
 
 #include "BuildSettings.h"
 
-
-
-#include "mptBaseMacros.h"
-
-#include <exception>
-#if !defined(MPT_WITH_MFC)
-#include <new>
-#endif // !MPT_WITH_MFC
-
-#if defined(MPT_WITH_MFC)
-// cppcheck-suppress missingInclude
-#include <afx.h>
-#endif // MPT_WITH_MFC
-
-
-
-OPENMPT_NAMESPACE_BEGIN
-
-
-
-// Exception handling helpers, because MFC requires explicit deletion of the exception object,
-// Thus, always call exactly one of mpt::rethrow_out_of_memory(e) or mpt::delete_out_of_memory(e).
-
-namespace mpt
-{
-
-#if defined(MPT_WITH_MFC)
-
-using out_of_memory = CMemoryException *;
-
-[[noreturn]] inline void throw_out_of_memory()
-{
-	AfxThrowMemoryException();
-}
-
-[[noreturn]] inline void rethrow_out_of_memory(out_of_memory e)
-{
-	MPT_UNREFERENCED_PARAMETER(e);
-	throw;
-}
-
-inline void delete_out_of_memory(out_of_memory & e)
-{
-	if(e)
-	{
-		e->Delete();
-		e = nullptr;
-	}
-}
-
-#else // !MPT_WITH_MFC
-
-using out_of_memory = const std::bad_alloc &;
-
-[[noreturn]] inline void throw_out_of_memory()
-{
-	throw std::bad_alloc();
-}
-
-[[noreturn]] inline void rethrow_out_of_memory(out_of_memory e)
-{
-	MPT_UNREFERENCED_PARAMETER(e);
-	throw;
-}
-
-inline void delete_out_of_memory(out_of_memory e)
-{
-	MPT_UNREFERENCED_PARAMETER(e);
-}
-
-#endif // MPT_WITH_MFC
-
-} // namespace mpt
-
-
-
-OPENMPT_NAMESPACE_END
+#include "mpt/out_of_memory/out_of_memory.hpp"
Index: common/mptExceptionText.h
===================================================================
--- common/mptExceptionText.h	(revision 14628)
+++ common/mptExceptionText.h	(working copy)
@@ -7,126 +7,8 @@
  * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
  */
 
-
 #pragma once
 
 #include "BuildSettings.h"
 
-
-
-#include "mptException.h"
-#include "mptString.h"
-
-#include <exception>
-
-
-
-OPENMPT_NAMESPACE_BEGIN
-
-
-
-namespace mpt
-{
-
-
-
-template <typename T> T get_exception_text_impl(const std::exception & e)
-{
-	if(e.what() && (std::strlen(e.what()) > 0))
-	{
-		return T(e.what());
-	} else if(typeid(e).name() && (std::strlen(typeid(e).name()) > 0))
-	{
-		return T(typeid(e).name());
-	} else
-	{
-		return T("unknown exception name");
-	}
-}
-
-template <typename T> inline T get_exception_text(const std::exception & e)
-{
-	return mpt::get_exception_text_impl<T>(e);
-}
-template <> inline std::string get_exception_text<std::string>(const std::exception & e)
-{
-	return mpt::get_exception_text_impl<std::string>(e);
-}
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-template <> inline mpt::lstring get_exception_text<mpt::lstring>(const std::exception & e)
-{
-	return mpt::ToLocale(mpt::CharsetException, mpt::get_exception_text_impl<std::string>(e));
-}
-#endif
-#if MPT_WSTRING_FORMAT
-template <> inline std::wstring get_exception_text<std::wstring>(const std::exception & e)
-{
-	return mpt::ToWide(mpt::CharsetException, mpt::get_exception_text_impl<std::string>(e));
-}
-#endif
-#if MPT_USTRING_MODE_UTF8
-template <> inline mpt::ustring get_exception_text<mpt::ustring>(const std::exception & e)
-{
-	return mpt::ToUnicode(mpt::CharsetException, mpt::get_exception_text_impl<std::string>(e));
-}
-#endif
-
-
-
-template <typename T> T get_current_exception_text_impl()
-{
-	try
-	{
-		throw;
-	} catch(const std::exception &e)
-	{
-		if(e.what() && (std::strlen(e.what()) > 0))
-		{
-			return T(e.what());
-		} else if(typeid(e).name() && (std::strlen(typeid(e).name()) > 0))
-		{
-			return T(typeid(e).name());
-		} else
-		{
-			return T("unknown exception name");
-		}
-	} catch(...)
-	{
-		return T("unknown exception");
-	}
-}
-
-template <typename T> inline T get_current_exception_text()
-{
-	return mpt::get_current_exception_text_impl<T>();
-}
-template <> inline std::string get_current_exception_text<std::string>()
-{
-	return mpt::get_current_exception_text_impl<std::string>();
-}
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-template <> inline mpt::lstring get_current_exception_text<mpt::lstring>()
-{
-	return mpt::ToLocale(mpt::CharsetException, mpt::get_current_exception_text_impl<std::string>());
-}
-#endif
-#if MPT_WSTRING_FORMAT
-template <> inline std::wstring get_current_exception_text<std::wstring>()
-{
-	return mpt::ToWide(mpt::CharsetException, mpt::get_current_exception_text_impl<std::string>());
-}
-#endif
-#if MPT_USTRING_MODE_UTF8
-template <> inline mpt::ustring get_current_exception_text<mpt::ustring>()
-{
-	return mpt::ToUnicode(mpt::CharsetException, mpt::get_current_exception_text_impl<std::string>());
-}
-#endif
-
-
-
-} // namespace mpt
-
-
-
-OPENMPT_NAMESPACE_END
+#include "mpt/exception_text/exception_text.hpp"
Index: common/mptMemory.h
===================================================================
--- common/mptMemory.h	(revision 14628)
+++ common/mptMemory.h	(working copy)
@@ -13,13 +13,13 @@
 #include "BuildSettings.h"
 
 
+#include "mpt/base/bit.hpp"
+#include "mpt/base/memory.hpp"
+
 #include "mptAssert.h"
 #include "mptBaseTypes.h"
 #include "mptSpan.h"
 
-#if MPT_CXX_AT_LEAST(20)
-#include <bit>
-#endif
 #include <utility>
 #include <type_traits>
 
@@ -33,85 +33,6 @@
 
 
 
-namespace mpt {
-
-
-
-typedef mpt::span<std::byte> byte_span;
-typedef mpt::span<const std::byte> const_byte_span;
-
-
-
-// Tell which types are safe for mpt::byte_cast.
-// signed char is actually not allowed to alias into an object representation,
-// which means that, if the actual type is not itself signed char but char or
-// unsigned char instead, dereferencing the signed char pointer is undefined
-// behaviour.
-template <typename T> struct is_byte_castable : public std::false_type { };
-template <> struct is_byte_castable<char>                : public std::true_type { };
-template <> struct is_byte_castable<unsigned char>       : public std::true_type { };
-template <> struct is_byte_castable<std::byte>           : public std::true_type { };
-template <> struct is_byte_castable<const char>          : public std::true_type { };
-template <> struct is_byte_castable<const unsigned char> : public std::true_type { };
-template <> struct is_byte_castable<const std::byte>     : public std::true_type { };
-
-
-template <typename T> struct is_byte        : public std::false_type { };
-template <> struct is_byte<std::byte>       : public std::true_type  { };
-template <> struct is_byte<const std::byte> : public std::true_type  { };
-
-
-template <typename T>
-constexpr bool declare_binary_safe(const T &) noexcept
-{
-	return false;
-}
-
-constexpr bool declare_binary_safe(const char &) noexcept
-{
-	return true;
-}
-constexpr bool declare_binary_safe(const uint8 &) noexcept
-{
-	return true;
-}
-constexpr bool declare_binary_safe(const int8 &) noexcept
-{
-	return true;
-}
-constexpr bool declare_binary_safe(const std::byte &) noexcept
-{
-	return true;
-}
-
-// Tell which types are safe to binary write into files.
-// By default, no types are safe.
-// When a safe type gets defined,
-// also specialize this template so that IO functions will work.
-template <typename T> struct is_binary_safe : public std::conditional<declare_binary_safe(T{}), std::true_type, std::false_type>::type { };
-
-// Generic Specialization for arrays.
-template <typename T, std::size_t N> struct is_binary_safe<T[N]> : public is_binary_safe<T> { };
-template <typename T, std::size_t N> struct is_binary_safe<const T[N]> : public is_binary_safe<T> { };
-template <typename T, std::size_t N> struct is_binary_safe<std::array<T, N>> : public is_binary_safe<T> { };
-template <typename T, std::size_t N> struct is_binary_safe<const std::array<T, N>> : public is_binary_safe<T> { };
-
-
-template <typename T>
-constexpr bool check_binary_size(std::size_t size) noexcept
-{
-	return true
-		&& (sizeof(T) == size)
-		&& (alignof(T) == 1)
-		&& std::is_standard_layout<T>::value
-		&& std::has_unique_object_representations<T>::value
-		&& mpt::is_binary_safe<T>::value
-		;
-}
-
-
-} // namespace mpt
-
 #define MPT_BINARY_STRUCT(type, size) \
 	constexpr bool declare_binary_safe(const type &) { return true; } \
 	static_assert(mpt::check_binary_size<type>(size)); \
@@ -160,201 +81,4 @@
 
 
 
-namespace mpt {
-
-
-
-#if MPT_CXX_AT_LEAST(20)
-using std::bit_cast;
-#else
-// C++2a compatible bit_cast.
-// Not implementing constexpr because this is not easily possible pre C++20.
-template <typename Tdst, typename Tsrc>
-MPT_FORCEINLINE typename std::enable_if<(sizeof(Tdst) == sizeof(Tsrc)) && std::is_trivially_copyable<Tsrc>::value && std::is_trivially_copyable<Tdst>::value, Tdst>::type bit_cast(const Tsrc & src) noexcept
-{
-	Tdst dst{};
-	std::memcpy(&dst, &src, sizeof(Tdst));
-	return dst;
-}
-#endif
-
-
-
-template <typename Tdst, typename Tsrc>
-struct byte_cast_impl
-{
-	inline Tdst operator () (Tsrc src) const noexcept
-	{
-		static_assert(sizeof(Tsrc) == sizeof(std::byte));
-		static_assert(sizeof(Tdst) == sizeof(std::byte));
-		// not checking is_byte_castable here because we are actually
-		// doing a static_cast and converting the value
-		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
-		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
-		return static_cast<Tdst>(src);
-	}
-};
-template <typename Tdst, typename Tsrc>
-struct byte_cast_impl<mpt::span<Tdst>, mpt::span<Tsrc> >
-{
-	inline mpt::span<Tdst> operator () (mpt::span<Tsrc> src) const noexcept
-	{
-		static_assert(sizeof(Tsrc) == sizeof(std::byte));
-		static_assert(sizeof(Tdst) == sizeof(std::byte));
-		static_assert(mpt::is_byte_castable<Tsrc>::value);
-		static_assert(mpt::is_byte_castable<Tdst>::value);
-		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
-		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
-		return mpt::as_span(mpt::byte_cast_impl<Tdst*, Tsrc*>()(src.data()), mpt::byte_cast_impl<Tdst*, Tsrc*>()(src.data() + src.size()));
-	}
-};
-template <typename Tdst, typename Tsrc>
-struct byte_cast_impl<Tdst*, Tsrc*>
-{
-	inline Tdst* operator () (Tsrc* src) const noexcept
-	{
-		static_assert(sizeof(Tsrc) == sizeof(std::byte));
-		static_assert(sizeof(Tdst) == sizeof(std::byte));
-		static_assert(mpt::is_byte_castable<Tsrc>::value);
-		static_assert(mpt::is_byte_castable<Tdst>::value);
-		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
-		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
-		return reinterpret_cast<Tdst*>(src);
-	}
-};
-
-template <typename Tdst, typename Tsrc>
-struct void_cast_impl;
-
-template <typename Tdst>
-struct void_cast_impl<Tdst*, void*>
-{
-	inline Tdst* operator () (void* src) const noexcept
-	{
-		static_assert(sizeof(Tdst) == sizeof(std::byte));
-		static_assert(mpt::is_byte_castable<Tdst>::value);
-		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
-		return reinterpret_cast<Tdst*>(src);
-	}
-};
-template <typename Tdst>
-struct void_cast_impl<Tdst*, const void*>
-{
-	inline Tdst* operator () (const void* src) const noexcept
-	{
-		static_assert(sizeof(Tdst) == sizeof(std::byte));
-		static_assert(mpt::is_byte_castable<Tdst>::value);
-		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
-		return reinterpret_cast<Tdst*>(src);
-	}
-};
-template <typename Tsrc>
-struct void_cast_impl<void*, Tsrc*>
-{
-	inline void* operator () (Tsrc* src) const noexcept
-	{
-		static_assert(sizeof(Tsrc) == sizeof(std::byte));
-		static_assert(mpt::is_byte_castable<Tsrc>::value);
-		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
-		return reinterpret_cast<void*>(src);
-	}
-};
-template <typename Tsrc>
-struct void_cast_impl<const void*, Tsrc*>
-{
-	inline const void* operator () (Tsrc* src) const noexcept
-	{
-		static_assert(sizeof(Tsrc) == sizeof(std::byte));
-		static_assert(mpt::is_byte_castable<Tsrc>::value);
-		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
-		return reinterpret_cast<const void*>(src);
-	}
-};
-
-// casts between different byte (char) types or pointers to these types
-template <typename Tdst, typename Tsrc>
-inline Tdst byte_cast(Tsrc src) noexcept
-{
-	return byte_cast_impl<Tdst, Tsrc>()(src);
-}
-
-// casts between pointers to void and pointers to byte
-template <typename Tdst, typename Tsrc>
-inline Tdst void_cast(Tsrc src) noexcept
-{
-	return void_cast_impl<Tdst, Tsrc>()(src);
-}
-
-
-
-template <typename T>
-MPT_CONSTEXPRINLINE std::byte as_byte(T src) noexcept
-{
-	static_assert(std::is_integral<T>::value);
-	return static_cast<std::byte>(static_cast<uint8>(src));
-}
-
-
-
-template <typename T>
-struct GetRawBytesFunctor
-{
-	inline mpt::const_byte_span operator () (const T & v) const
-	{
-		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
-		return mpt::as_span(reinterpret_cast<const std::byte *>(&v), sizeof(T));
-	}
-	inline mpt::byte_span operator () (T & v) const
-	{
-		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
-		return mpt::as_span(reinterpret_cast<std::byte *>(&v), sizeof(T));
-	}
-};
-
-template <typename T, std::size_t N>
-struct GetRawBytesFunctor<T[N]>
-{
-	inline mpt::const_byte_span operator () (const T (&v)[N]) const
-	{
-		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
-		return mpt::as_span(reinterpret_cast<const std::byte *>(v), N * sizeof(T));
-	}
-	inline mpt::byte_span operator () (T (&v)[N]) const
-	{
-		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
-		return mpt::as_span(reinterpret_cast<std::byte *>(v), N * sizeof(T));
-	}
-};
-
-template <typename T, std::size_t N>
-struct GetRawBytesFunctor<const T[N]>
-{
-	inline mpt::const_byte_span operator () (const T (&v)[N]) const
-	{
-		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
-		return mpt::as_span(reinterpret_cast<const std::byte *>(v), N * sizeof(T));
-	}
-};
-
-// In order to be able to partially specialize it,
-// as_raw_memory is implemented via a class template.
-// Do not overload or specialize as_raw_memory directly.
-// Using a wrapper (by default just around a cast to const std::byte *),
-// allows for implementing raw memory access
-// via on-demand generating a cached serialized representation.
-template <typename T> inline mpt::const_byte_span as_raw_memory(const T & v)
-{
-	return mpt::GetRawBytesFunctor<T>()(v);
-}
-template <typename T> inline mpt::byte_span as_raw_memory(T & v)
-{
-	return mpt::GetRawBytesFunctor<T>()(v);
-}
-
-
-
-} // namespace mpt
-
-
-
 OPENMPT_NAMESPACE_END
Index: common/mptMutex.h
===================================================================
--- common/mptMutex.h	(revision 14628)
+++ common/mptMutex.h	(working copy)
@@ -11,123 +11,16 @@
 
 #include "BuildSettings.h"
 
-#if MPT_CXX_AT_LEAST(20)
-#include <version>
-#else // !C++20
-#include <array>
-#endif // C++20
+#include "mpt/mutex/mutex.hpp"
 
-#if !MPT_PLATFORM_MULTITHREADED
-#define MPT_MUTEX_NONE 1
-#elif MPT_COMPILER_GENERIC
-#define MPT_MUTEX_STD 1
-#elif (defined(__MINGW32__) || defined(__MINGW64__)) && !defined(_GLIBCXX_HAS_GTHREADS) && defined(MPT_WITH_MINGWSTDTHREADS)
-#define MPT_MUTEX_STD 1
-#elif (defined(__MINGW32__) || defined(__MINGW64__)) && !defined(_GLIBCXX_HAS_GTHREADS)
-#define MPT_MUTEX_WIN32 1
-#else
-#define MPT_MUTEX_STD 1
-#endif
-
-#ifndef MPT_MUTEX_STD
-#define MPT_MUTEX_STD 0
-#endif
-#ifndef MPT_MUTEX_WIN32
-#define MPT_MUTEX_WIN32 0
-#endif
-#ifndef MPT_MUTEX_NONE
-#define MPT_MUTEX_NONE 0
-#endif
-
 #if defined(MODPLUG_TRACKER) && MPT_MUTEX_NONE
 #error "OpenMPT requires mutexes."
 #endif
 
-#if MPT_MUTEX_STD
-#if !MPT_COMPILER_GENERIC && (defined(__MINGW32__) || defined(__MINGW64__)) && !defined(_GLIBCXX_HAS_GTHREADS) && defined(MPT_WITH_MINGWSTDTHREADS)
-#include <mingw.mutex.h>
-#else
-#include <mutex>
-#endif
-#elif MPT_MUTEX_WIN32
-#include <windows.h>
-#endif // MPT_MUTEX
-
 OPENMPT_NAMESPACE_BEGIN
 
 namespace mpt {
 
-#if MPT_MUTEX_STD
-
-typedef std::mutex mutex;
-typedef std::recursive_mutex recursive_mutex;
-
-#elif MPT_MUTEX_WIN32
-
-// compatible with c++11 std::mutex, can eventually be replaced without touching any usage site
-class mutex {
-private:
-	CRITICAL_SECTION impl;
-public:
-	mutex() { InitializeCriticalSection(&impl); }
-	~mutex() { DeleteCriticalSection(&impl); }
-	void lock() { EnterCriticalSection(&impl); }
-	bool try_lock() { return TryEnterCriticalSection(&impl) ? true : false; }
-	void unlock() { LeaveCriticalSection(&impl); }
-};
-
-// compatible with c++11 std::recursive_mutex, can eventually be replaced without touching any usage site
-class recursive_mutex {
-private:
-	CRITICAL_SECTION impl;
-public:
-	recursive_mutex() { InitializeCriticalSection(&impl); }
-	~recursive_mutex() { DeleteCriticalSection(&impl); }
-	void lock() { EnterCriticalSection(&impl); }
-	bool try_lock() { return TryEnterCriticalSection(&impl) ? true : false; }
-	void unlock() { LeaveCriticalSection(&impl); }
-};
-
-#else // MPT_MUTEX_NONE
-
-class mutex {
-public:
-	mutex() { }
-	~mutex() { }
-	void lock() { }
-	bool try_lock() { return true; }
-	void unlock() { }
-};
-
-class recursive_mutex {
-public:
-	recursive_mutex() { }
-	~recursive_mutex() { }
-	void lock() { }
-	bool try_lock() { return true; }
-	void unlock() { }
-};
-
-#endif // MPT_MUTEX
-
-#if MPT_MUTEX_STD
-
-template <typename T> using lock_guard = std::lock_guard<T>;
-
-#else // !MPT_MUTEX_STD
-
-// compatible with c++11 std::lock_guard, can eventually be replaced without touching any usage site
-template< typename mutex_type >
-class lock_guard {
-private:
-	mutex_type & mutex;
-public:
-	lock_guard( mutex_type & m ) : mutex(m) { mutex.lock(); }
-	~lock_guard() { mutex.unlock(); }
-};
-
-#endif // MPT_MUTEX_STD
-
 #ifdef MODPLUG_TRACKER
 
 class recursive_mutex_with_lock_count {
Index: common/mptOS.cpp
===================================================================
--- common/mptOS.cpp	(revision 14628)
+++ common/mptOS.cpp	(working copy)
@@ -89,95 +89,6 @@
 
 
 #if MPT_OS_WINDOWS
-
-
-static mpt::OS::Windows::Version VersionFromNTDDI_VERSION() noexcept
-{
-	// Initialize to used SDK version
-	mpt::OS::Windows::Version::System System =
-		#if NTDDI_VERSION >= 0x0A000000 // NTDDI_WIN10
-			mpt::OS::Windows::Version::Win10
-		#elif NTDDI_VERSION >= 0x06030000 // NTDDI_WINBLUE
-			mpt::OS::Windows::Version::Win81
-		#elif NTDDI_VERSION >= 0x06020000 // NTDDI_WIN8
-			mpt::OS::Windows::Version::Win8
-		#elif NTDDI_VERSION >= 0x06010000 // NTDDI_WIN7
-			mpt::OS::Windows::Version::Win7
-		#elif NTDDI_VERSION >= 0x06000000 // NTDDI_VISTA
-			mpt::OS::Windows::Version::WinVista
-		#elif NTDDI_VERSION >= 0x05020000 // NTDDI_WS03
-			mpt::OS::Windows::Version::WinXP64
-		#elif NTDDI_VERSION >= NTDDI_WINXP
-			mpt::OS::Windows::Version::WinXP
-		#elif NTDDI_VERSION >= NTDDI_WIN2K
-			mpt::OS::Windows::Version::Win2000
-		#else
-			mpt::OS::Windows::Version::WinNT4
-		#endif
-		;
-	return mpt::OS::Windows::Version(System, mpt::OS::Windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
-}
-
-
-static mpt::OS::Windows::Version::System SystemVersionFrom_WIN32_WINNT() noexcept
-{
-	#if defined(_WIN32_WINNT)
-		return mpt::OS::Windows::Version::System((static_cast<uint64>(_WIN32_WINNT) & 0xff00u) >> 8, (static_cast<uint64>(_WIN32_WINNT) & 0x00ffu) >> 0);
-	#else
-		return mpt::OS::Windows::Version::System();
-	#endif
-}
-
-
-static mpt::OS::Windows::Version GatherWindowsVersion() noexcept
-{
-#if MPT_OS_WINDOWS_WINRT
-	return VersionFromNTDDI_VERSION();
-#else // !MPT_OS_WINDOWS_WINRT
-	OSVERSIONINFOEXW versioninfoex;
-	MemsetZero(versioninfoex);
-	versioninfoex.dwOSVersionInfoSize = sizeof(versioninfoex);
-#if MPT_COMPILER_MSVC
-#pragma warning(push)
-#pragma warning(disable:4996) // 'GetVersionExW': was declared deprecated
-#pragma warning(disable:28159) // Consider using 'IsWindows*' instead of 'GetVersionExW'. Reason: Deprecated. Use VerifyVersionInfo* or IsWindows* macros from VersionHelpers.
-#endif // MPT_COMPILER_MSVC
-#if MPT_COMPILER_CLANG
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-#endif // MPT_COMPILER_CLANG
-	if(GetVersionExW((LPOSVERSIONINFOW)&versioninfoex) == FALSE)
-	{
-		return VersionFromNTDDI_VERSION();
-	}
-#if MPT_COMPILER_MSVC
-#pragma warning(pop)
-#endif // MPT_COMPILER_MSVC
-#if MPT_COMPILER_CLANG
-#pragma clang diagnostic pop
-#endif // MPT_COMPILER_CLANG
-	if(versioninfoex.dwPlatformId != VER_PLATFORM_WIN32_NT)
-	{
-		return VersionFromNTDDI_VERSION();
-	}
-	DWORD dwProductType = 0;
-	#if (_WIN32_WINNT >= 0x0600) // _WIN32_WINNT_VISTA
-		dwProductType = PRODUCT_UNDEFINED;
-		if(GetProductInfo(versioninfoex.dwMajorVersion, versioninfoex.dwMinorVersion, versioninfoex.wServicePackMajor, versioninfoex.wServicePackMinor, &dwProductType) == FALSE)
-		{
-			dwProductType = PRODUCT_UNDEFINED;
-		}
-	#endif
-	return mpt::OS::Windows::Version(
-		mpt::OS::Windows::Version::System(versioninfoex.dwMajorVersion, versioninfoex.dwMinorVersion),
-		mpt::OS::Windows::Version::ServicePack(versioninfoex.wServicePackMajor, versioninfoex.wServicePackMinor),
-		versioninfoex.dwBuildNumber,
-		dwProductType
-		);
-#endif // MPT_OS_WINDOWS_WINRT
-}
-
-
 #ifdef MODPLUG_TRACKER
 
 namespace {
@@ -185,7 +96,7 @@
 {
 	mpt::OS::Windows::Version version;
 	WindowsVersionCache() noexcept
-		: version(GatherWindowsVersion())
+		: version(mpt::osinfo::windows::Version::Current())
 	{
 	}
 };
@@ -198,37 +109,9 @@
 }
 
 #endif // MODPLUG_TRACKER
-
-
 #endif // MPT_OS_WINDOWS
 
 
-Version::Version() noexcept
-	: m_SystemIsWindows(false)
-	, m_System()
-	, m_ServicePack()
-	, m_Build()
-	, m_Type()
-{
-}
-
-
-Version Version::NoWindows() noexcept
-{
-	return Version();
-}
-
-
-Version::Version(mpt::OS::Windows::Version::System system, mpt::OS::Windows::Version::ServicePack servicePack, mpt::OS::Windows::Version::Build build, mpt::OS::Windows::Version::TypeId type) noexcept
-	: m_SystemIsWindows(true)
-	, m_System(system)
-	, m_ServicePack(servicePack)
-	, m_Build(build)
-	, m_Type(type)
-{
-}
-
-
 mpt::OS::Windows::Version Version::Current() noexcept
 {
 	#if MPT_OS_WINDOWS
@@ -235,7 +118,7 @@
 		#ifdef MODPLUG_TRACKER
 			return GatherWindowsVersionFromCache();
 		#else // !MODPLUG_TRACKER
-			return GatherWindowsVersion();
+			return mpt::osinfo::windows::Version::Current();
 		#endif // MODPLUG_TRACKER
 	#else // !MPT_OS_WINDOWS
 		return mpt::OS::Windows::Version::NoWindows();
@@ -243,180 +126,30 @@
 }
 
 
-bool Version::IsWindows() const noexcept
+Version::Version() noexcept
+	: mpt::osinfo::windows::Version(mpt::osinfo::windows::Version::NoWindows())
 {
-	return m_SystemIsWindows;
 }
 
 
-bool Version::IsBefore(mpt::OS::Windows::Version::System version) const noexcept
+Version Version::NoWindows() noexcept
 {
-	if(!m_SystemIsWindows)
-	{
-		return false;
-	}
-	return m_System < version;
+	return Version();
 }
 
 
-bool Version::IsBefore(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::ServicePack servicePack) const noexcept
+Version::Version(mpt::osinfo::windows::Version v) noexcept
+	: mpt::osinfo::windows::Version(v)
 {
-	if(!m_SystemIsWindows)
-	{
-		return false;
-	}
-	if(m_System > version)
-	{
-		return false;
-	}
-	if(m_System < version)
-	{
-		return true;
-	}
-	return m_ServicePack < servicePack;
 }
 
 
-bool Version::IsBefore(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::Build build) const noexcept
+Version::Version(mpt::OS::Windows::Version::System system, mpt::OS::Windows::Version::ServicePack servicePack, mpt::OS::Windows::Version::Build build, mpt::OS::Windows::Version::TypeId type) noexcept
+	: mpt::osinfo::windows::Version(system, servicePack, build, type)
 {
-	if(!m_SystemIsWindows)
-	{
-		return false;
-	}
-	if(m_System > version)
-	{
-		return false;
-	}
-	if(m_System < version)
-	{
-		return true;
-	}
-	return m_Build < build;
 }
 
 
-bool Version::IsBefore(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::ServicePack servicePack, mpt::OS::Windows::Version::Build build) const noexcept
-{
-	if(!m_SystemIsWindows)
-	{
-		return false;
-	}
-	if(m_System > version)
-	{
-		return false;
-	}
-	if(m_System < version)
-	{
-		return true;
-	}
-	if(m_ServicePack > servicePack)
-	{
-		return false;
-	}
-	if(m_ServicePack < servicePack)
-	{
-		return true;
-	}
-	return m_Build < build;
-}
-
-
-bool Version::IsAtLeast(mpt::OS::Windows::Version::System version) const noexcept
-{
-	if(!m_SystemIsWindows)
-	{
-		return false;
-	}
-	return m_System >= version;
-}
-
-
-bool Version::IsAtLeast(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::ServicePack servicePack) const noexcept
-{
-	if(!m_SystemIsWindows)
-	{
-		return false;
-	}
-	if(m_System < version)
-	{
-		return false;
-	}
-	if(m_System > version)
-	{
-		return true;
-	}
-	return m_ServicePack >= servicePack;
-}
-
-
-bool Version::IsAtLeast(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::Build build) const noexcept
-{
-	if(!m_SystemIsWindows)
-	{
-		return false;
-	}
-	if(m_System < version)
-	{
-		return false;
-	}
-	if(m_System > version)
-	{
-		return true;
-	}
-	return m_Build >= build;
-}
-
-
-bool Version::IsAtLeast(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::ServicePack servicePack, mpt::OS::Windows::Version::Build build) const noexcept
-{
-	if(!m_SystemIsWindows)
-	{
-		return false;
-	}
-	if(m_System < version)
-	{
-		return false;
-	}
-	if(m_System > version)
-	{
-		return true;
-	}
-	if(m_ServicePack < servicePack)
-	{
-		return false;
-	}
-	if(m_ServicePack > servicePack)
-	{
-		return true;
-	}
-	return m_Build >= build;
-}
-
-
-mpt::OS::Windows::Version::System Version::GetSystem() const noexcept
-{
-	return m_System;
-}
-
-
-mpt::OS::Windows::Version::ServicePack Version::GetServicePack() const noexcept
-{
-	return m_ServicePack;
-}
-
-
-mpt::OS::Windows::Version::Build Version::GetBuild() const noexcept
-{
-	return m_Build;
-}
-
-
-mpt::OS::Windows::Version::TypeId Version::GetTypeId() const noexcept
-{
-	return m_Type;
-}
-
-
 static constexpr struct { Version::System version; const mpt::uchar * name; bool showDetails; } versionMap[] =
 {
 	{ mpt::OS::Windows::Version::WinNewer, UL_("Windows 10 (or newer)"), false },
Index: common/mptOS.h
===================================================================
--- common/mptOS.h	(revision 14628)
+++ common/mptOS.h	(working copy)
@@ -12,10 +12,11 @@
 
 #include "BuildSettings.h"
 
-
 #include "mptLibrary.h"
 
+#include "mpt/osinfo/windows_version.hpp"
 
+
 OPENMPT_NAMESPACE_BEGIN
 
 
@@ -56,87 +57,15 @@
 
 
 class Version
+	: public mpt::osinfo::windows::Version
 {
 
 public:
 
-	enum Number : uint64
-	{
-		WinNT4   = 0x0000000400000000ull,
-		Win2000  = 0x0000000500000000ull,
-		WinXP    = 0x0000000500000001ull,
-		WinXP64  = 0x0000000500000002ull,
-		WinVista = 0x0000000600000000ull,
-		Win7     = 0x0000000600000001ull,
-		Win8     = 0x0000000600000002ull,
-		Win81    = 0x0000000600000003ull,
-		Win10    = 0x0000000a00000000ull,
-		WinNewer = Win10 + 1ull
-	};
-
-	struct System
-	{
-		uint32 Major = 0;
-		uint32 Minor = 0;
-		System() = default;
-		constexpr System(Number number) noexcept
-			: Major(static_cast<uint32>((static_cast<uint64>(number) >> 32) & 0xffffffffu))
-			, Minor(static_cast<uint32>((static_cast<uint64>(number) >>  0) & 0xffffffffu))
-		{
-		}
-		explicit constexpr System(uint64 number) noexcept
-			: Major(static_cast<uint32>((number >> 32) & 0xffffffffu))
-			, Minor(static_cast<uint32>((number >>  0) & 0xffffffffu))
-		{
-		}
-		explicit constexpr System(uint32 major, uint32 minor) noexcept
-			: Major(major)
-			, Minor(minor)
-		{
-		}
-		constexpr operator uint64 () const noexcept
-		{
-			return (static_cast<uint64>(Major) << 32) | (static_cast<uint64>(Minor) << 0);
-		}
-	};
-
-	struct ServicePack
-	{
-		uint16 Major = 0;
-		uint16 Minor = 0;
-		ServicePack() = default;
-		explicit constexpr ServicePack(uint16 major, uint16 minor) noexcept
-			: Major(major)
-			, Minor(minor)
-		{
-		}
-		constexpr bool HasServicePack() const noexcept
-		{
-			return Major != 0 || Minor != 0;
-		}
-		constexpr operator uint32 () const noexcept
-		{
-			return (static_cast<uint32>(Major) << 16) | (static_cast<uint32>(Minor) << 0);
-		}
-	};
-
-	typedef uint32 Build;
-
-	typedef uint32 TypeId;
-
 	static mpt::ustring VersionToString(mpt::OS::Windows::Version::System version);
 
 private:
 
-	bool m_SystemIsWindows;
-
-	System m_System;
-	ServicePack m_ServicePack;
-	Build m_Build;
-	TypeId m_Type;
-
-private:
-
 	Version() noexcept;
 
 public:
@@ -143,30 +72,19 @@
 
 	static Version NoWindows() noexcept;
 
-	Version(mpt::OS::Windows::Version::System system, mpt::OS::Windows::Version::ServicePack servicePack, mpt::OS::Windows::Version::Build build, mpt::OS::Windows::Version::TypeId type) noexcept;
-
 public:
 
-	static mpt::OS::Windows::Version Current() noexcept;
+	Version(mpt::osinfo::windows::Version v) noexcept;
 
 public:
 
-	bool IsWindows() const noexcept;
+	Version(mpt::OS::Windows::Version::System system, mpt::OS::Windows::Version::ServicePack servicePack, mpt::OS::Windows::Version::Build build, mpt::OS::Windows::Version::TypeId type) noexcept;
 
-	bool IsBefore(mpt::OS::Windows::Version::System version) const noexcept;
-	bool IsBefore(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::ServicePack servicePack) const noexcept;
-	bool IsBefore(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::Build build) const noexcept;
-	bool IsBefore(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::ServicePack servicePack, mpt::OS::Windows::Version::Build build) const noexcept;
+public:
 
-	bool IsAtLeast(mpt::OS::Windows::Version::System version) const noexcept;
-	bool IsAtLeast(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::ServicePack servicePack) const noexcept;
-	bool IsAtLeast(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::Build build) const noexcept;
-	bool IsAtLeast(mpt::OS::Windows::Version::System version, mpt::OS::Windows::Version::ServicePack servicePack, mpt::OS::Windows::Version::Build build) const noexcept;
+	static mpt::OS::Windows::Version Current() noexcept;
 
-	mpt::OS::Windows::Version::System GetSystem() const noexcept;
-	mpt::OS::Windows::Version::ServicePack GetServicePack() const noexcept;
-	mpt::OS::Windows::Version::Build GetBuild() const noexcept;
-	mpt::OS::Windows::Version::TypeId GetTypeId() const noexcept;
+public:
 
 	mpt::ustring GetName() const;
 #ifdef MODPLUG_TRACKER
Index: common/mptOSError.h
===================================================================
--- common/mptOSError.h	(revision 14628)
+++ common/mptOSError.h	(working copy)
@@ -7,189 +7,8 @@
  * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
  */
 
-
 #pragma once
 
 #include "BuildSettings.h"
 
-
-
-#include "mptBaseMacros.h"
-#include "mptException.h"
-#include "mptString.h"
-#include "mptStringFormat.h"
-
-#if defined(MODPLUG_TRACKER) || (defined(LIBOPENMPT_BUILD) && defined(LIBOPENMPT_BUILD_TEST))
-#if MPT_OS_WINDOWS
-#include <stdexcept>
-#if MPT_OS_WINDOWS_WINRT
-#include <vector>
-#endif // MPT_OS_WINDOWS_WINRT
-#endif // MPT_OS_WINDOWS
-#endif // MODPLUG_TRACKER || (LIBOPENMPT_BUILD && LIBOPENMPT_BUILD_TEST)
-
-#if defined(MODPLUG_TRACKER) || (defined(LIBOPENMPT_BUILD) && defined(LIBOPENMPT_BUILD_TEST))
-#if MPT_OS_WINDOWS
-#include <windows.h>
-#endif // MPT_OS_WINDOWS
-#endif // MODPLUG_TRACKER || (LIBOPENMPT_BUILD && LIBOPENMPT_BUILD_TEST)
-
-
-
-OPENMPT_NAMESPACE_BEGIN
-
-
-#if defined(MODPLUG_TRACKER) || (defined(LIBOPENMPT_BUILD) && defined(LIBOPENMPT_BUILD_TEST))
-#if MPT_OS_WINDOWS
-
-namespace mpt
-{
-
-namespace Windows
-{
-
-
-inline mpt::ustring GetErrorMessage(DWORD errorCode, HANDLE hModule = NULL)
-{
-	mpt::ustring message;
-#if MPT_OS_WINDOWS_WINRT
-	std::vector<TCHAR> msgbuf(65536);
-	if(FormatMessage(
-		(hModule ? FORMAT_MESSAGE_FROM_HMODULE : 0) | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
-		hModule,
-		errorCode,
-		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-		msgbuf.data(),
-		mpt::saturate_cast<DWORD>(msgbuf.size()),
-		NULL)
-		== 0)
-	{
-		DWORD e = GetLastError();
-		if((e == ERROR_NOT_ENOUGH_MEMORY) || (e == ERROR_OUTOFMEMORY))
-		{
-			mpt::throw_out_of_memory();
-		}
-		return {};
-	}
-	message = mpt::ToUnicode(mpt::winstring(msgbuf.data()));
-#else
-	void *lpMsgBuf = nullptr;
-	if(FormatMessage(
-		FORMAT_MESSAGE_ALLOCATE_BUFFER | (hModule ? FORMAT_MESSAGE_FROM_HMODULE : 0) | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
-		hModule,
-		errorCode,
-		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-		(LPTSTR)&lpMsgBuf,
-		0,
-		NULL)
-		== 0)
-	{
-		DWORD e = GetLastError();
-		if(lpMsgBuf)
-		{
-			LocalFree(lpMsgBuf);	
-		}
-		if((e == ERROR_NOT_ENOUGH_MEMORY) || (e == ERROR_OUTOFMEMORY))
-		{
-			mpt::throw_out_of_memory();
-		}
-		return {};
-	}
-	if(!lpMsgBuf)
-	{
-		return {};
-	}
-	try
-	{
-		message = mpt::ToUnicode(mpt::winstring((LPTSTR)lpMsgBuf));
-	} catch(mpt::out_of_memory e)
-	{
-		LocalFree(lpMsgBuf);
-		mpt::rethrow_out_of_memory(e);
-	}
-	LocalFree(lpMsgBuf);
-#endif
-	return message;
-}
-
-
-class Error
-	: public std::runtime_error
-{
-public:
-	Error(DWORD errorCode, HANDLE hModule = NULL)
-		: std::runtime_error(mpt::ToCharset(mpt::CharsetException, MPT_UFORMAT("Windows Error: 0x{}: {}")(mpt::ufmt::hex0<8>(errorCode), GetErrorMessage(errorCode, hModule))))
-	{
-		return;
-	}
-};
-
-
-inline HANDLE CheckFileHANDLE(HANDLE handle)
-{
-	if(handle == INVALID_HANDLE_VALUE)
-	{
-		DWORD err = ::GetLastError();
-		if((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY))
-		{
-			mpt::throw_out_of_memory();
-		}
-		throw Windows::Error(err);
-	}
-	return handle;
-}
-
-
-inline HANDLE CheckHANDLE(HANDLE handle)
-{
-	if(handle == NULL)
-	{
-		DWORD err = ::GetLastError();
-		if((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY))
-		{
-			mpt::throw_out_of_memory();
-		}
-		throw Windows::Error(err);
-	}
-	return handle;
-}
-
-
-inline void CheckBOOL(BOOL result)
-{
-	if(result == FALSE)
-	{
-		DWORD err = ::GetLastError();
-		if((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY))
-		{
-			mpt::throw_out_of_memory();
-		}
-		throw Windows::Error(err);
-	}
-}
-
-
-inline void ExpectError(DWORD expected)
-{
-	DWORD err = ::GetLastError();
-	if(err != expected)
-	{
-		if((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY))
-		{
-			mpt::throw_out_of_memory();
-		}
-		throw Windows::Error(err);
-	}
-}
-
-
-} // namespace Windows
-
-} // namespace mpt
-
-#endif // MPT_OS_WINDOWS
-#endif // MODPLUG_TRACKER || (LIBOPENMPT_BUILD && LIBOPENMPT_BUILD_TEST)
-
-
-
-OPENMPT_NAMESPACE_END
+#include "mpt/system_error/system_error.hpp"
Index: common/mptPathString.cpp
===================================================================
--- common/mptPathString.cpp	(revision 14628)
+++ common/mptPathString.cpp	(working copy)
@@ -13,6 +13,7 @@
 #include "misc_util.h"
 
 #include "mptUUID.h"
+#include "mptRandom.h"
 
 #if MPT_OS_WINDOWS
 #include <windows.h>
@@ -586,7 +587,7 @@
 {
 	mpt::PathString filename = mpt::GetTempDirectory();
 	filename += (!fileNamePrefix.empty() ? fileNamePrefix + P_("_") : mpt::PathString());
-	filename += mpt::PathString::FromUnicode(mpt::UUID::GenerateLocalUseOnly().ToUString());
+	filename += mpt::PathString::FromUnicode(mpt::UUID::GenerateLocalUseOnly(mpt::global_prng()).ToUString());
 	filename += (!fileNameExtension.empty() ? P_(".") + fileNameExtension : mpt::PathString());
 	return filename;
 }
Index: common/mptPathString.h
===================================================================
--- common/mptPathString.h	(revision 14628)
+++ common/mptPathString.h	(working copy)
@@ -12,19 +12,17 @@
 
 #include "BuildSettings.h"
 
+#include "mpt/base/namespace.hpp"
+
 #include <vector>
 
 #include "FlagSet.h"
 
-OPENMPT_NAMESPACE_BEGIN
-
-
-
 #define MPT_DEPRECATED_PATH
 //#define MPT_DEPRECATED_PATH [[deprecated]]
 
+OPENMPT_NAMESPACE_BEGIN
 
-
 namespace mpt
 {
 
Index: common/mptRandom.cpp
===================================================================
--- common/mptRandom.cpp	(revision 14628)
+++ common/mptRandom.cpp	(working copy)
@@ -11,259 +11,11 @@
 
 #include "mptRandom.h"
 
-#include "Endianness.h"
-#include "mptCRC.h"
-
-#include <chrono>
-
-#include <cmath>
-#include <cstdlib>
-
-
 OPENMPT_NAMESPACE_BEGIN
 
-
 namespace mpt
 {
 
-
-#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
-
-template <typename T>
-static T log2(T x)
-{
-	return std::log(x) / std::log(static_cast<T>(2));
-}
-
-
-static MPT_CONSTEXPRINLINE int lower_bound_entropy_bits(unsigned int x)
-{
-	return detail::lower_bound_entropy_bits(x);
-}
-
-
-template <typename T>
-static MPT_CONSTEXPRINLINE bool is_mask(T x)
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	typedef typename std::make_unsigned<T>::type unsigned_T;
-	unsigned_T ux = static_cast<unsigned_T>(x);
-	unsigned_T mask = 0;
-	for(std::size_t bits = 0; bits <= (sizeof(unsigned_T) * 8); ++bits)
-	{
-		mask = (mask << 1) | 1u;
-		if(ux == mask)
-		{
-			return true;
-		}
-	}
-	return false;
-}
-
-#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
-
-
-namespace {
-template <typename T> struct default_hash { };
-template <> struct default_hash<uint8>  { typedef mpt::checksum::crc16 type; };
-template <> struct default_hash<uint16> { typedef mpt::checksum::crc16 type; };
-template <> struct default_hash<uint32> { typedef mpt::checksum::crc32c type; };
-template <> struct default_hash<uint64> { typedef mpt::checksum::crc64_jones type; };
-}
-
-template <typename T>
-static T generate_timeseed()
-{
-	// Note: CRC is actually not that good a choice here, but it is simple and we
-	// already have an implementaion available. Better choices for mixing entropy
-	// would be a hash function with proper avalanche characteristics or a block
-	// or stream cipher with any pre-choosen random key and IV. The only aspect we
-	// really need here is whitening of the bits.
-	typename mpt::default_hash<T>::type hash;
-
-	{
-		uint64be time;
-		time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock().now().time_since_epoch()).count();
-		std::byte bytes[sizeof(time)];
-		std::memcpy(bytes, &time, sizeof(time));
-		hash(std::begin(bytes), std::end(bytes));
-	}
-
-#if !defined(MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK)
-	{
-		uint64be time;
-		time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock().now().time_since_epoch()).count();
-		std::byte bytes[sizeof(time)];
-		std::memcpy(bytes, &time, sizeof(time));
-		hash(std::begin(bytes), std::end(bytes));
-	}
-#endif // !MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK
-
-	return static_cast<T>(hash.result());
-
-}
-
-
-sane_random_device::sane_random_device()
-#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
-	: rd_reliable(false)
-#endif // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
-{
-#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
-	try
-	{
-		prd = std::make_unique<std::random_device>();
-		rd_reliable = ((*prd).entropy() > 0.0);
-	} catch(mpt::out_of_memory e)
-	{
-		mpt::rethrow_out_of_memory(e);
-	} catch(const std::exception &)
-	{
-		rd_reliable = false;	
-	}
-	if(!rd_reliable)
-#endif // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
-	{
-		init_fallback();
-	}
-}
-
-sane_random_device::sane_random_device(const std::string & token_)
-	: token(token_)
-#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
-	, rd_reliable(false)
-#endif // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
-{
-#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
-	try
-	{
-		prd = std::make_unique<std::random_device>(token);
-		rd_reliable = ((*prd).entropy() > 0.0);
-	} catch(mpt::out_of_memory e)
-	{
-		mpt::rethrow_out_of_memory(e);
-	} catch(const std::exception &)
-	{
-		rd_reliable = false;	
-	}
-	if(!rd_reliable)
-#endif // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
-	{
-		init_fallback();
-	}
-}
-
-void sane_random_device::init_fallback()
-{
-	if(!rd_fallback)
-	{
-		if(token.length() > 0)
-		{
-			uint64 seed_val = mpt::generate_timeseed<uint64>();
-			std::vector<unsigned int> seeds;
-			seeds.push_back(static_cast<uint32>(seed_val >> 32));
-			seeds.push_back(static_cast<uint32>(seed_val >>  0));
-			for(std::size_t i = 0; i < token.length(); ++i)
-			{
-				seeds.push_back(static_cast<unsigned int>(static_cast<unsigned char>(token[i])));
-			}
-			std::seed_seq seed(seeds.begin(), seeds.end());
-			rd_fallback = std::make_unique<std::mt19937>(seed);
-		} else
-		{
-			uint64 seed_val = mpt::generate_timeseed<uint64>();
-			unsigned int seeds[2];
-			seeds[0] = static_cast<uint32>(seed_val >> 32);
-			seeds[1] = static_cast<uint32>(seed_val >>  0);
-			std::seed_seq seed(seeds + 0, seeds + 2);
-			rd_fallback = std::make_unique<std::mt19937>(seed);
-		}
-	}
-}
-
-sane_random_device::result_type sane_random_device::operator()()
-{
-	mpt::lock_guard<mpt::mutex> l(m);
-	result_type result = 0;
-#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
-	if(prd)
-	{
-		try
-		{
-			if constexpr(std::random_device::min() != 0 || !mpt::is_mask(std::random_device::max()))
-			{ // insane std::random_device
-				//  This implementation is not exactly uniformly distributed but good enough
-				// for OpenMPT.
-				constexpr double rd_min = static_cast<double>(std::random_device::min());
-				constexpr double rd_max = static_cast<double>(std::random_device::max());
-				constexpr double rd_range = rd_max - rd_min;
-				constexpr double rd_size = rd_range + 1.0;
-				const double rd_entropy = mpt::log2(rd_size);
-				const int iterations = static_cast<int>(std::ceil(result_bits() / rd_entropy));
-				double tmp = 0.0;
-				for(int i = 0; i < iterations; ++i)
-				{
-					tmp = (tmp * rd_size) + (static_cast<double>((*prd)()) - rd_min);
-				}
-				double result_01 = std::floor(tmp / std::pow(rd_size, iterations));
-				result = static_cast<result_type>(std::floor(result_01 * (static_cast<double>(max() - min()) + 1.0))) + min();
-			} else
-			{ // sane std::random_device
-				result = 0;
-				std::size_t rd_bits = mpt::lower_bound_entropy_bits(std::random_device::max());
-				for(std::size_t entropy = 0; entropy < (sizeof(result_type) * 8); entropy += rd_bits)
-				{
-					if(rd_bits < (sizeof(result_type) * 8))
-					{
-						result = (result << rd_bits) | static_cast<result_type>((*prd)());
-					} else
-					{
-						result = result | static_cast<result_type>((*prd)());
-					}
-				}
-			}
-		} catch(const std::exception &)
-		{
-			rd_reliable = false;
-			init_fallback();
-		}
-	} else
-	{
-		rd_reliable = false;
-	}
-	if(!rd_reliable)
-#endif // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
-	{ // std::random_device is unreliable
-		//  XOR the generated random number with more entropy from the time-seeded
-		// PRNG.
-		//  Note: This is safe even if the std::random_device itself is implemented
-		// as a std::mt19937 PRNG because we are very likely using a different
-		// seed.
-		result ^= mpt::random<result_type>(*rd_fallback);
-	}
-	return result;
-}
-
-uint8 prng_random_device_time_seeder::generate_seed8()
-{
-	return mpt::generate_timeseed<uint8>();
-}
-
-uint16 prng_random_device_time_seeder::generate_seed16()
-{
-	return mpt::generate_timeseed<uint16>();
-}
-
-uint32 prng_random_device_time_seeder::generate_seed32()
-{
-	return mpt::generate_timeseed<uint32>();
-}
-
-uint64 prng_random_device_time_seeder::generate_seed64()
-{
-	return mpt::generate_timeseed<uint64>();
-}
-
 #if defined(MODPLUG_TRACKER) && !defined(MPT_BUILD_WINESUPPORT)
 
 static mpt::random_device *g_rd = nullptr;
@@ -305,8 +57,6 @@
 
 #endif // MODPLUG_TRACKER && !MPT_BUILD_WINESUPPORT
 
-
 } // namespace mpt
 
-
 OPENMPT_NAMESPACE_END
Index: common/mptRandom.h
===================================================================
--- common/mptRandom.h	(revision 14628)
+++ common/mptRandom.h	(working copy)
@@ -12,14 +12,21 @@
 
 #include "BuildSettings.h"
 
+#include "mpt/base/bit.hpp"
+#ifdef MODPLUG_TRACKER
+#include "mpt/random/crand.hpp"
+#endif // MODPLUG_TRACKER
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/random/engine.hpp"
+#include "mpt/random/engine_lcg.hpp"
+#include "mpt/random/seed.hpp"
+
 #include "mptMutex.h"
 
 #include <limits>
 #include <random>
 
-#ifdef MODPLUG_TRACKER
-#include <cstdlib>
-#endif // MODPLUG_TRACKER
 
 
 OPENMPT_NAMESPACE_BEGIN
@@ -43,204 +50,11 @@
 {
 
 
-inline constexpr uint32 DETERMINISTIC_RNG_SEED = 3141592653u; // pi
 
-
-namespace detail
-{
-
-MPT_CONSTEXPRINLINE int lower_bound_entropy_bits(unsigned int x)
-{
-	return mpt::bit_width(x) == static_cast<unsigned int>(mpt::popcount(x)) ? mpt::bit_width(x) : mpt::bit_width(x) - 1;
-}
-
-}
-
-
-template <typename Trng> struct engine_traits
-{
-	typedef typename Trng::result_type result_type;
-	static MPT_CONSTEXPRINLINE int result_bits()
-	{
-		return Trng::result_bits();
-	}
-	template<typename Trd>
-	static inline Trng make(Trd & rd)
-	{
-		return Trng(rd);
-	}
-};
-
-
-template <typename T, typename Trng>
-inline T random(Trng & rng)
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	typedef typename std::make_unsigned<T>::type unsigned_T;
-	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
-	unsigned_T result = 0;
-	for(std::size_t entropy = 0; entropy < (sizeof(T) * 8); entropy += rng_bits)
-	{
-		if constexpr(rng_bits < (sizeof(T) * 8))
-		{
-			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
-			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
-		} else
-		{
-			result = static_cast<unsigned_T>(rng());
-		}
-	}
-	return static_cast<T>(result);
-}
-
-template <typename T, std::size_t required_entropy_bits, typename Trng>
-inline T random(Trng & rng)
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	typedef typename std::make_unsigned<T>::type unsigned_T;
-	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
-	unsigned_T result = 0;
-	for(std::size_t entropy = 0; entropy < std::min(required_entropy_bits, sizeof(T) * 8); entropy += rng_bits)
-	{
-		if constexpr(rng_bits < (sizeof(T) * 8))
-		{
-			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
-			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
-		} else
-		{
-			result = static_cast<unsigned_T>(rng());
-		}
-	}
-	if constexpr(required_entropy_bits >= (sizeof(T) * 8))
-	{
-		return static_cast<T>(result);
-	} else
-	{
-		return static_cast<T>(result & ((static_cast<unsigned_T>(1) << required_entropy_bits) - static_cast<unsigned_T>(1)));
-	}
-}
-
-template <typename T, typename Trng>
-inline T random(Trng & rng, std::size_t required_entropy_bits)
-{
-	static_assert(std::numeric_limits<T>::is_integer);
-	typedef typename std::make_unsigned<T>::type unsigned_T;
-	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
-	unsigned_T result = 0;
-	for(std::size_t entropy = 0; entropy < std::min(required_entropy_bits, sizeof(T) * 8); entropy += rng_bits)
-	{
-		if constexpr(rng_bits < (sizeof(T) * 8))
-		{
-			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
-			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
-		} else
-		{
-			result = static_cast<unsigned_T>(rng());
-		}
-	}
-	if(required_entropy_bits >= (sizeof(T) * 8))
-	{
-		return static_cast<T>(result);
-	} else
-	{
-		return static_cast<T>(result & ((static_cast<unsigned_T>(1) << required_entropy_bits) - static_cast<unsigned_T>(1)));
-	}
-}
-
-template <typename T>
-struct uniform_real_distribution
-{
-private:
-	T a;
-	T b;
-public:
-	inline uniform_real_distribution(T a_, T b_)
-		: a(a_)
-		, b(b_)
-	{
-		return;
-	}
-	template <typename Trng>
-	inline T operator()(Trng & rng) const
-	{
-		const int mantissa_bits = std::numeric_limits<T>::digits;
-		return ((b - a) * static_cast<T>(mpt::random<uint64, mantissa_bits>(rng)) / static_cast<T>((static_cast<uint64>(1u) << mantissa_bits))) + a;
-	}
-};
-
-
-template <typename T, typename Trng>
-inline T random(Trng & rng, T min, T max)
-{
-	static_assert(!std::numeric_limits<T>::is_integer);
-	typedef mpt::uniform_real_distribution<T> dis_type;
-	dis_type dis(min, max);
-	return static_cast<T>(dis(rng));
-}
-
-
 namespace rng
 {
 
-#if MPT_COMPILER_MSVC
-#pragma warning(push)
-#pragma warning(disable:4724) // potential mod by 0
-#endif // MPT_COMPILER_MSVC
 
-template <typename Tstate, typename Tvalue, Tstate m, Tstate a, Tstate c, Tstate result_mask, int result_shift, int result_bits_>
-class lcg
-{
-public:
-	typedef Tstate state_type;
-	typedef Tvalue result_type;
-private:
-	state_type state;
-public:
-	template <typename Trng>
-	explicit inline lcg(Trng & rd)
-		: state(mpt::random<state_type>(rd))
-	{
-		operator()(); // we return results from the current state and update state after returning. results in better pipelining.
-	}
-	explicit inline lcg(state_type seed)
-		: state(seed)
-	{
-		operator()(); // we return results from the current state and update state after returning. results in better pipelining.
-	}
-public:
-	static MPT_CONSTEXPRINLINE result_type min()
-	{
-		return static_cast<result_type>(0);
-	}
-	static MPT_CONSTEXPRINLINE result_type max()
-	{
-		static_assert(((result_mask >> result_shift) << result_shift) == result_mask);
-		return static_cast<result_type>(result_mask >> result_shift);
-	}
-	static MPT_CONSTEXPRINLINE int result_bits()
-	{
-		static_assert(((static_cast<Tstate>(1) << result_bits_) - 1) == (result_mask >> result_shift));
-		return result_bits_;
-	}
-	inline result_type operator()()
-	{
-		// we return results from the current state and update state after returning. results in better pipelining.
-		state_type s = state;
-		result_type result = static_cast<result_type>((s & result_mask) >> result_shift);
-		s = Util::ModIfNotZero<state_type, m>((a * s) + c);
-		state = s;
-		return result;
-	}
-};
-
-#if MPT_COMPILER_MSVC
-#pragma warning(pop)
-#endif // MPT_COMPILER_MSVC
-
-typedef lcg<uint32, uint16, 0u, 214013u, 2531011u, 0x7fff0000u, 16, 15> lcg_msvc;
-typedef lcg<uint32, uint16, 0x80000000u, 1103515245u, 12345u, 0x7fff0000u, 16, 15> lcg_c99;
-typedef lcg<uint64, uint32, 0ull, 6364136223846793005ull, 1ull, 0xffffffff00000000ull, 32, 32> lcg_musl;
-
 template <typename Tstate, typename Tvalue, Tstate x1, Tstate x2, Tstate x3, Tstate x4, int rol1, int rol2>
 class modplug
 {
@@ -297,286 +111,7 @@
 } // namespace rng
 
 
-#ifdef MODPLUG_TRACKER
 
-namespace rng
-{
-
-class crand
-{
-public:
-	using state_type = void;
-	using result_type = int;
-private:
-	static void reseed(uint32 seed)
-	{
-		std::srand(seed);
-	}
-public:
-	template <typename Trd>
-	static void reseed(Trd & rd)
-	{
-		reseed(mpt::random<uint32>(rd));
-	}
-public:
-	crand() = default;
-	explicit crand(const std::string &)
-	{
-		return;
-	}
-public:
-	static MPT_CONSTEXPRINLINE result_type min()
-	{
-		return 0;
-	}
-	static MPT_CONSTEXPRINLINE result_type max()
-	{
-		return RAND_MAX;
-	}
-	static MPT_CONSTEXPRINLINE int result_bits()
-	{
-		return detail::lower_bound_entropy_bits(RAND_MAX);
-	}
-	result_type operator()()
-	{
-		return std::rand();
-	}
-};
-
-} // namespace rng
-
-#endif // MODPLUG_TRACKER
-
-
-//  C++11 std::random_device may be implemented as a deterministic PRNG.
-//  There is no way to seed this PRNG and it is allowed to be seeded with the
-// same value on each program invocation. This makes std::random_device
-// completely useless even as a non-cryptographic entropy pool.
-//  We fallback to time-seeded std::mt19937 if std::random_device::entropy() is
-// 0 or less.
-class sane_random_device
-{
-private:
-	mpt::mutex m;
-	std::string token;
-#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
-	std::unique_ptr<std::random_device> prd;
-	bool rd_reliable;
-#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
-	std::unique_ptr<std::mt19937> rd_fallback;
-public:
-	using result_type = unsigned int;
-private:
-	void init_fallback();
-public:
-	sane_random_device();
-	sane_random_device(const std::string & token);
-	static MPT_CONSTEXPRINLINE result_type min()
-	{
-		return std::numeric_limits<result_type>::min();
-	}
-	static MPT_CONSTEXPRINLINE result_type max()
-	{
-		return std::numeric_limits<result_type>::max();
-	}
-	static MPT_CONSTEXPRINLINE int result_bits()
-	{
-		return sizeof(result_type) * 8;
-	}
-	result_type operator()();
-};
-
-
-template <std::size_t N>
-class seed_seq_values
-{
-private:
-	unsigned int seeds[N];
-public:
-	template <typename Trd>
-	explicit seed_seq_values(Trd & rd)
-	{
-		for(std::size_t i = 0; i < N; ++i)
-		{
-			seeds[i] = rd();
-		}
-	}
-	const unsigned int * begin() const
-	{
-		return seeds + 0;
-	}
-	const unsigned int * end() const
-	{
-		return seeds + N;
-	}
-};
-
-
-// C++11 random does not provide any sane way to determine the amount of entropy
-// required to seed a particular engine. VERY STUPID.
-// List the ones we are likely to use.
-
-template <> struct engine_traits<std::mt19937> {
-	enum : std::size_t { seed_bits = sizeof(std::mt19937::result_type) * 8 * std::mt19937::state_size };
-	typedef std::mt19937 rng_type;
-	typedef rng_type::result_type result_type;
-	static MPT_CONSTEXPRINLINE int result_bits() { return rng_type::word_size; }
-	template<typename Trd> static inline rng_type make(Trd & rd)
-	{
-		std::unique_ptr<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>> values = std::make_unique<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>>(rd);
-		std::seed_seq seed(values->begin(), values->end());
-		return rng_type(seed);
-	}
-};
-
-template <> struct engine_traits<std::mt19937_64> {
-	enum : std::size_t { seed_bits = sizeof(std::mt19937_64::result_type) * 8 * std::mt19937_64::state_size };
-	typedef std::mt19937_64 rng_type;
-	typedef rng_type::result_type result_type;
-	static MPT_CONSTEXPRINLINE int result_bits() { return rng_type::word_size; }
-	template<typename Trd> static inline rng_type make(Trd & rd)
-	{
-		std::unique_ptr<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>> values = std::make_unique<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>>(rd);
-		std::seed_seq seed(values->begin(), values->end());
-		return rng_type(seed);
-	}
-};
-
-template <> struct engine_traits<std::ranlux24_base> {
-	enum : std::size_t { seed_bits = std::ranlux24_base::word_size };
-	typedef std::ranlux24_base rng_type;
-	typedef rng_type::result_type result_type;
-	static MPT_CONSTEXPRINLINE int result_bits() { return rng_type::word_size; }
-	template<typename Trd> static inline rng_type make(Trd & rd)
-	{
-		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
-		std::seed_seq seed(values.begin(), values.end());
-		return rng_type(seed);
-	}
-};
-
-template <> struct engine_traits<std::ranlux48_base> {
-	enum : std::size_t { seed_bits = std::ranlux48_base::word_size };
-	typedef std::ranlux48_base rng_type;
-	typedef rng_type::result_type result_type;
-	static MPT_CONSTEXPRINLINE int result_bits() { return rng_type::word_size; }
-	template<typename Trd> static inline rng_type make(Trd & rd)
-	{
-		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
-		std::seed_seq seed(values.begin(), values.end());
-		return rng_type(seed);
-	}
-};
-
-template <> struct engine_traits<std::ranlux24> {
-	enum : std::size_t { seed_bits = std::ranlux24_base::word_size };
-	typedef std::ranlux24 rng_type;
-	typedef rng_type::result_type result_type;
-	static MPT_CONSTEXPRINLINE int result_bits() { return std::ranlux24_base::word_size; }
-	template<typename Trd> static inline rng_type make(Trd & rd)
-	{
-		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
-		std::seed_seq seed(values.begin(), values.end());
-		return rng_type(seed);
-	}
-};
-
-template <> struct engine_traits<std::ranlux48> {
-	enum : std::size_t { seed_bits = std::ranlux48_base::word_size };
-	typedef std::ranlux48 rng_type;
-	typedef rng_type::result_type result_type;
-	static MPT_CONSTEXPRINLINE int result_bits() { return std::ranlux48_base::word_size; }
-	template<typename Trd> static inline rng_type make(Trd & rd)
-	{
-		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
-		std::seed_seq seed(values.begin(), values.end());
-		return rng_type(seed);
-	}
-};
-
-
-class prng_random_device_time_seeder
-{
-private:
-	uint8 generate_seed8();
-	uint16 generate_seed16();
-	uint32 generate_seed32();
-	uint64 generate_seed64();
-protected:
-	template <typename T> inline T generate_seed();
-protected:
-	prng_random_device_time_seeder() = default;
-};
-
-template <> inline uint8 prng_random_device_time_seeder::generate_seed() { return generate_seed8(); }
-template <> inline uint16 prng_random_device_time_seeder::generate_seed() { return generate_seed16(); }
-template <> inline uint32 prng_random_device_time_seeder::generate_seed() { return generate_seed32(); }
-template <> inline uint64 prng_random_device_time_seeder::generate_seed() { return generate_seed64(); }
-
-class prng_random_device_deterministic_seeder
-{
-protected:
-	template <typename T> constexpr T generate_seed() noexcept
-	{
-		return static_cast<T>(mpt::DETERMINISTIC_RNG_SEED);
-	}
-protected:
-	prng_random_device_deterministic_seeder() = default;
-};
-
-template <typename Trng = mpt::rng::lcg_musl, typename seeder = mpt::prng_random_device_time_seeder>
-class prng_random_device
-	: private seeder
-{
-public:
-	using result_type = unsigned int;
-private:
-	mpt::mutex m;
-	Trng rng;
-public:
-	prng_random_device()
-		: rng(seeder::template generate_seed<typename Trng::state_type>())
-	{
-		return;
-	}
-	prng_random_device(const std::string &)
-		: rng(seeder::template generate_seed<typename Trng::state_type>())
-	{
-		return;
-	}
-	static MPT_CONSTEXPRINLINE result_type min()
-	{
-		return std::numeric_limits<unsigned int>::min();
-	}
-	static MPT_CONSTEXPRINLINE result_type max()
-	{
-		return std::numeric_limits<unsigned int>::max();
-	}
-	static MPT_CONSTEXPRINLINE int result_bits()
-	{
-		return sizeof(unsigned int) * 8;
-	}
-	result_type operator()()
-	{
-		mpt::lock_guard<mpt::mutex> l(m);
-		return mpt::random<unsigned int>(rng);
-	}
-};
-
-
-using deterministc_random_device = mpt::prng_random_device<mpt::rng::lcg_musl>;
-
-using deterministic_fast_prng = mpt::rng::lcg_msvc;
-using deterministic_good_prng = mpt::rng::lcg_musl;
-
-
-template <typename Trng, typename Trd>
-inline Trng make_prng(Trd & rd)
-{
-	return mpt::engine_traits<Trng>::make(rd);
-}
-
-
 template <typename Trng>
 class thread_safe_prng
 	: private Trng
@@ -626,8 +161,8 @@
 
 //  2. Use fast PRNGs in order to not waste time fuzzing more complex PRNG
 //     implementations.
-using fast_prng = deterministic_fast_prng;
-using good_prng = deterministic_good_prng;
+using fast_prng = deterministic_fast_engine;
+using good_prng = deterministic_good_engine;
 
 #else // !MPT_BUILD_FUZZER
 
@@ -636,8 +171,8 @@
 
 // We cannot use std::minstd_rand here because it has not a power-of-2 sized
 // output domain which we rely upon.
-using fast_prng = mpt::rng::lcg_msvc; // about 3 ALU operations, ~32bit of state, suited for inner loops
-using good_prng = std::ranlux48;
+using fast_prng = fast_engine; // about 3 ALU operations, ~32bit of state, suited for inner loops
+using good_prng = good_engine;
 
 #endif // MPT_BUILD_FUZZER
 
Index: common/mptSpan.h
===================================================================
--- common/mptSpan.h	(revision 14628)
+++ common/mptSpan.h	(working copy)
@@ -7,234 +7,8 @@
  * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
  */
 
-
 #pragma once
 
 #include "BuildSettings.h"
 
-
-#include "mptBaseTypes.h"
-
-#if MPT_CXX_AT_LEAST(20)
-#include <array>
-#include <span>
-#else // !C++20
-#include <array>
-#include <iterator>
-#include <limits>
-#include <type_traits>
-#endif // C++20
-
-
-
-OPENMPT_NAMESPACE_BEGIN
-
-
-
-
-namespace mpt {
-
-
-
-#if MPT_CXX_AT_LEAST(20)
-
-using std::span;
-using std::dynamic_extent;
-
-#else // !C++20
-
-//  Simplified version of gsl::span.
-//  Non-owning read-only or read-write view into a contiguous block of T
-// objects, i.e. equivalent to a (beg,end) or (data,size) tuple.
-//  Can eventually be replaced without further modifications with a full C++20
-// std::span.
-
-inline constexpr std::size_t dynamic_extent = std::numeric_limits<std::size_t>::max();
-
-template <typename T>
-class span
-{
-
-public:
-
-	using element_type = T;
-	using value_type = typename std::remove_cv<T>::type;
-	using index_type = std::size_t;
-	using pointer = T *;
-	using const_pointer = const T *;
-	using reference = T &;
-	using const_reference = const T &;
-
-	using iterator = pointer;
-	using const_iterator = const_pointer;
-
-	using difference_type = typename std::iterator_traits<iterator>::difference_type;
-
-private:
-
-	T * m_beg;
-	T * m_end;
-
-public:
-
-	span() noexcept
-		: m_beg(nullptr)
-		, m_end(nullptr)
-	{
-	}
-
-	span(pointer beg, pointer end)
-		: m_beg(beg)
-		, m_end(end)
-	{
-	}
-
-	span(pointer data, index_type size)
-		: m_beg(data)
-		, m_end(data + size)
-	{
-	}
-
-	template <std::size_t N> span(element_type (&arr)[N])
-		: m_beg(arr)
-		, m_end(arr + N)
-	{
-	}
-
-	template <std::size_t N> span(std::array<value_type, N> &arr)
-		: m_beg(arr.data())
-		, m_end(arr.data() + arr.size())
-	{
-	}
-
-	template <std::size_t N> span(const std::array<value_type, N> &arr)
-		: m_beg(arr.data())
-		, m_end(arr.data() + arr.size())
-	{
-	}
-
-	span(const span &other) noexcept = default;
-
-	template <typename U> span(const span<U> &other)
-		: m_beg(other.begin())
-		, m_end(other.end())
-	{
-	}
-
-	span & operator = (const span & other) noexcept = default;
-	
-	iterator begin() const
-	{
-		return iterator(m_beg);
-	}
-	iterator end() const
-	{
-		return iterator(m_end);
-	}
-
-	const_iterator cbegin() const
-	{
-		return const_iterator(begin());
-	}
-	const_iterator cend() const
-	{
-		return const_iterator(end());
-	}
-
-	reference operator[](index_type index)
-	{
-		return at(index);
-	}
-	const_reference operator[](index_type index) const
-	{
-		return at(index);
-	}
-
-	bool operator==(span const & other) const noexcept
-	{
-		return size() == other.size() && (m_beg == other.m_beg || std::equal(begin(), end(), other.begin()));
-	}
-	bool operator!=(span const & other) const noexcept
-	{
-		return !(*this == other);
-	}
-
-	reference at(index_type index)
-	{
-		return m_beg[index];
-	}
-	const_reference at(index_type index) const
-	{
-		return m_beg[index];
-	}
-
-	pointer data() const noexcept
-	{
-		return m_beg;
-	}
-
-	bool empty() const noexcept
-	{
-		return size() == 0;
-	}
-
-	index_type size() const noexcept
-	{
-		return static_cast<index_type>(std::distance(m_beg, m_end));
-	}
-	index_type length() const noexcept
-	{
-		return size();
-	}
-
-	span subspan(std::size_t offset, std::size_t count = mpt::dynamic_extent) const
-	{
-		return span(data() + offset, (count == mpt::dynamic_extent) ? (size() - offset) : count);
-	}
-
-	span first(std::size_t count) const
-	{
-		return span(data(), count);
-	}
-
-	span last(std::size_t count) const
-	{
-		return span(data() + (size() - count), count);
-	}
-
-}; // class span
-
-#endif // C++20
-
-template <typename T> inline span<T> as_span(T * beg, T * end)
-{
-	return span<T>(beg, end);
-}
-
-template <typename T> inline span<T> as_span(T * data, std::size_t size)
-{
-	return span<T>(data, size);
-}
-
-template <typename T, std::size_t N> inline span<T> as_span(T (&arr)[N])
-{
-	return span<T>(std::begin(arr), std::end(arr));
-}
-
-template <typename T, std::size_t N> inline span<T> as_span(std::array<T, N> & cont)
-{
-	return span<T>(cont);
-}
-
-template <typename T, std::size_t N> inline span<const T> as_span(const std::array<T, N> & cont)
-{
-	return span<const T>(cont);
-}
-
-
-
-} // namespace mpt
-
-
-
-OPENMPT_NAMESPACE_END
+#include "mpt/base/span.hpp"
Index: common/mptString.cpp
===================================================================
--- common/mptString.cpp	(revision 14628)
+++ common/mptString.cpp	(working copy)
@@ -12,9 +12,12 @@
 
 #include "Endianness.h"
 
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
 #include <locale>
 #include <string>
-#include <stdexcept>
 #include <vector>
 
 #include <cstdlib>
@@ -31,11 +34,7 @@
 #include <windows.h>
 #endif // MPT_OS_WINDOWS
 
-#if MPT_OS_DJGPP && defined(MPT_ENABLE_CHARSET_LOCALE)
-#include <dpmi.h>
-#endif // MPT_OS_DJGPP && MPT_ENABLE_CHARSET_LOCALE
 
-
 OPENMPT_NAMESPACE_BEGIN
 
 
@@ -305,105 +304,6 @@
 
 
 
-/*
-default 1:1 mapping
-static constexpr char32_t CharsetTableISO8859_1[256] = {
-	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
-	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
-	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
-	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
-	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
-	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
-	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
-	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
-	0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f,
-	0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f,
-	0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
-	0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf,
-	0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
-	0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
-	0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
-	0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
-};
-*/
-
-static constexpr char32_t CharsetTableISO8859_15[256] = {
-	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
-	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
-	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
-	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
-	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
-	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
-	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
-	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
-	0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f,
-	0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f,
-	0x00a0,0x00a1,0x00a2,0x00a3,0x20ac,0x00a5,0x0160,0x00a7,0x0161,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
-	0x00b0,0x00b1,0x00b2,0x00b3,0x017d,0x00b5,0x00b6,0x00b7,0x017e,0x00b9,0x00ba,0x00bb,0x0152,0x0153,0x0178,0x00bf,
-	0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
-	0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
-	0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
-	0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
-};
-
-static constexpr char32_t CharsetTableWindows1252[256] = {
-	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
-	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
-	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
-	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
-	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
-	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
-	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
-	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
-	0x20ac,0x0081,0x201a,0x0192,0x201e,0x2026,0x2020,0x2021,0x02c6,0x2030,0x0160,0x2039,0x0152,0x008d,0x017d,0x008f,
-	0x0090,0x2018,0x2019,0x201c,0x201d,0x2022,0x2013,0x2014,0x02dc,0x2122,0x0161,0x203a,0x0153,0x009d,0x017e,0x0178,
-	0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
-	0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf,
-	0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
-	0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
-	0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
-	0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
-};
-
-static constexpr char32_t CharsetTableCP850[256] = {
-	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
-	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
-	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
-	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
-	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
-	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
-	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
-	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x2302,
-	0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7,0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5,
-	0x00c9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9,0x00ff,0x00d6,0x00dc,0x00F8,0x00a3,0x00D8,0x00D7,0x0192,
-	0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba,0x00bf,0x00AE,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb,
-	0x2591,0x2592,0x2593,0x2502,0x2524,0x00C1,0x00C2,0x00C0,0x00A9,0x2563,0x2551,0x2557,0x255d,0x00A2,0x00A5,0x2510,
-	0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x00E3,0x00C3,0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x00A4,
-	0x00F0,0x00D0,0x00CA,0x00CB,0x00C8,0x0131,0x00CD,0x00CE,0x00CF,0x2518,0x250c,0x2588,0x2584,0x00A6,0x00CC,0x2580,
-	0x00D3,0x00df,0x00D4,0x00D2,0x00F5,0x00D5,0x00b5,0x00FE,0x00DE,0x00DA,0x00DB,0x00D9,0x00FD,0x00DD,0x00AF,0x00B4,
-	0x00AD,0x00b1,0x2017,0x00BE,0x00B6,0x00A7,0x00f7,0x00B8,0x00b0,0x00A8,0x00b7,0x00B9,0x00B3,0x00b2,0x25a0,0x00a0
-};
-
-static constexpr char32_t CharsetTableCP437[256] = {
-	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
-	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
-	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
-	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
-	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
-	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
-	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
-	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x2302,
-	0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7,0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5,
-	0x00c9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9,0x00ff,0x00d6,0x00dc,0x00a2,0x00a3,0x00a5,0x20a7,0x0192,
-	0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba,0x00bf,0x2310,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb,
-	0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556,0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510,
-	0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f,0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567,
-	0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b,0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580,
-	0x03b1,0x00df,0x0393,0x03c0,0x03a3,0x03c3,0x00b5,0x03c4,0x03a6,0x0398,0x03a9,0x03b4,0x221e,0x03c6,0x03b5,0x2229,
-	0x2261,0x00b1,0x2265,0x2264,0x2320,0x2321,0x00f7,0x2248,0x00b0,0x2219,0x00b7,0x221a,0x207f,0x00b2,0x25a0,0x00a0
-};
-
-
 #define C(x) (mpt::char_value((x)))
 
 // AMS1 actually only supports ASCII plus the modified control characters and no high chars at all.
@@ -450,677 +350,26 @@
 #undef C
 
 
-#if MPT_OS_WINDOWS
-
-static bool TestCodePage(UINT cp)
-{
-	return IsValidCodePage(cp) ? true : false;
-}
-
-static bool HasCharset(Charset charset)
-{
-	bool result = false;
-	switch(charset)
-	{
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-		case Charset::Locale:      result = true; break;
-#endif
-		case Charset::UTF8:        result = TestCodePage(CP_UTF8); break;
-		case Charset::ASCII:       result = TestCodePage(20127);   break;
-		case Charset::ISO8859_1:   result = TestCodePage(28591);   break;
-		case Charset::ISO8859_15:  result = TestCodePage(28605);   break;
-		case Charset::CP850:       result = TestCodePage(850);     break;
-		case Charset::CP437:       result = TestCodePage(437);     break;
-		case Charset::Windows1252: result = TestCodePage(1252);    break;
-		case Charset::CP437AMS:    result = false; break;
-		case Charset::CP437AMS2:   result = false; break;
-	}
-	return result;
-}
-
-static UINT CharsetToCodepage(Charset charset)
-{
-	switch(charset)
-	{
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-		case Charset::Locale:      return CP_ACP;  break;
-#endif
-		case Charset::UTF8:        return CP_UTF8; break;
-		case Charset::ASCII:       return 20127;   break;
-		case Charset::ISO8859_1:   return 28591;   break;
-		case Charset::ISO8859_15:  return 28605;   break;
-		case Charset::CP850:       return 850;     break;
-		case Charset::CP437:       return 437;     break;
-		case Charset::CP437AMS:    return 437;     break; // fallback, should not happen
-		case Charset::CP437AMS2:   return 437;     break; // fallback, should not happen
-		case Charset::Windows1252: return 1252;    break;
-	}
-	return 0;
-}
-
-template<typename Tdststring>
-static Tdststring EncodeCodepage(UINT codepage, const mpt::wstring &src)
-{
-	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
-	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
-	Tdststring encoded_string;
-	int required_size = WideCharToMultiByte(codepage, 0, src.data(), mpt::saturate_cast<int>(src.size()), nullptr, 0, nullptr, nullptr);
-	if(required_size > 0)
-	{
-		encoded_string.resize(required_size);
-		WideCharToMultiByte(codepage, 0, src.data(), mpt::saturate_cast<int>(src.size()), reinterpret_cast<CHAR*>(encoded_string.data()), required_size, nullptr, nullptr);
-	}
-	return encoded_string;
-}
-
-template<typename Tsrcstring>
-static mpt::wstring DecodeCodepage(UINT codepage, const Tsrcstring &src)
-{
-	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
-	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
-	mpt::wstring decoded_string;
-	int required_size = MultiByteToWideChar(codepage, 0, reinterpret_cast<const CHAR*>(src.data()), mpt::saturate_cast<int>(src.size()), nullptr, 0);
-	if(required_size > 0)
-	{
-		decoded_string.resize(required_size);
-		MultiByteToWideChar(codepage, 0, reinterpret_cast<const CHAR*>(src.data()), mpt::saturate_cast<int>(src.size()), decoded_string.data(), required_size);
-	}
-	return decoded_string;
-}
-
-#endif // MPT_OS_WINDOWS
-
-
-template<typename Tsrcstring>
-static mpt::wstring From8bit(const Tsrcstring &str, const char32_t (&table)[256], mpt::wchar replacement = MPT_WCHAR('\uFFFD'))
-{
-	mpt::wstring res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		std::size_t c = static_cast<std::size_t>(mpt::char_value(str[i]));
-		if(c < std::size(table))
-		{
-			res.push_back(static_cast<mpt::wchar>(table[c]));
-		} else
-		{
-			res.push_back(replacement);
-		}
-	}
-	return res;
-}
-
-template<typename Tdststring>
-static Tdststring To8bit(const mpt::wstring &str, const char32_t (&table)[256], char replacement = '?')
-{
-	Tdststring res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		char32_t c = static_cast<char32_t>(str[i]);
-		bool found = false;
-		// Try non-control characters first.
-		// In cases where there are actual characters mirrored in this range (like in AMS/AMS2 character sets),
-		// characters in the common range are preferred this way.
-		for(std::size_t x = 0x20; x < std::size(table); ++x)
-		{
-			if(c == table[x])
-			{
-				res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
-				found = true;
-				break;
-			}
-		}
-		if(!found)
-		{
-			// try control characters
-			for(std::size_t x = 0x00; x < std::size(table) && x < 0x20; ++x)
-			{
-				if(c == table[x])
-				{
-					res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
-					found = true;
-					break;
-				}
-			}
-		}
-		if(!found)
-		{
-			res.push_back(replacement);
-		}
-	}
-	return res;
-}
-
-template<typename Tsrcstring>
-static mpt::wstring FromAscii(const Tsrcstring &str, mpt::wchar replacement = MPT_WCHAR('\uFFFD'))
-{
-	mpt::wstring res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		uint8 c = str[i];
-		if(c <= 0x7f)
-		{
-			res.push_back(static_cast<mpt::wchar>(static_cast<uint32>(c)));
-		} else
-		{
-			res.push_back(replacement);
-		}
-	}
-	return res;
-}
-
-template<typename Tdststring>
-static Tdststring ToAscii(const mpt::wstring &str, char replacement = '?')
-{
-	Tdststring res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		char32_t c = static_cast<char32_t>(str[i]);
-		if(c <= 0x7f)
-		{
-			res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(c)));
-		} else
-		{
-			res.push_back(replacement);
-		}
-	}
-	return res;
-}
-
-template<typename Tsrcstring>
-static mpt::wstring FromISO_8859_1(const Tsrcstring &str, mpt::wchar replacement = MPT_WCHAR('\uFFFD'))
-{
-	MPT_UNREFERENCED_PARAMETER(replacement);
-	mpt::wstring res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		uint8 c = str[i];
-		res.push_back(static_cast<mpt::wchar>(static_cast<uint32>(c)));
-	}
-	return res;
-}
-
-template<typename Tdststring>
-static Tdststring ToISO_8859_1(const mpt::wstring &str, char replacement = '?')
-{
-	Tdststring res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		char32_t c = static_cast<char32_t>(str[i]);
-		if(c <= 0xff)
-		{
-			res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(c)));
-		} else
-		{
-			res.push_back(replacement);
-		}
-	}
-	return res;
-}
-
-
-#if defined(MPT_ENABLE_CHARSET_LOCALE) && !defined(MPT_LOCALE_ASSUME_CHARSET)
-
-// Note:
-//
-//  std::codecvt::out in LLVM libc++ does not advance in and out pointers when
-// running into a non-convertible character. This can happen when no locale is
-// set on FreeBSD or MacOSX. This behaviour violates the C++ standard.
-//
-//  We apply the following (albeit costly, even on other platforms) work-around:
-//  If the conversion errors out and does not advance the pointers at all, we
-// retry the conversion with a space character prepended to the string. If it
-// still does error out, we retry the whole conversion character by character.
-//  This is costly even on other platforms in one single case: The first
-// character is an invalid Unicode code point or otherwise not convertible. Any
-// following non-convertible characters are not a problem.
-
-static std::wstring LocaleDecode(const std::string &str, const std::locale & locale, wchar_t replacement = L'\uFFFD', int retry = 0, bool * progress = nullptr)
-{
-	if(str.empty())
-	{
-		return std::wstring();
-	}
-	std::vector<wchar_t> out;
-	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
-	std::mbstate_t state = std::mbstate_t();
-	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
-	codecvt_type::result result = codecvt_type::partial;
-	const char * in_begin = str.data();
-	const char * in_end = in_begin + str.size();
-	out.resize((in_end - in_begin) * (mpt::saturate_cast<std::size_t>(facet.max_length()) + 1));
-	wchar_t * out_begin = &(out[0]);
-	wchar_t * out_end = &(out[0]) + out.size();
-	const char * in_next = nullptr;
-	wchar_t * out_next = nullptr;
-	do
-	{
-		if(retry == 2)
-		{
-			for(;;)
-			{
-				in_next = nullptr;
-				out_next = nullptr;
-				result = facet.in(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
-				if(result == codecvt_type::partial && in_next == in_begin + 1)
-				{
-					in_begin = in_next;
-					out_begin = out_next;
-					continue;
-				} else
-				{
-					break;
-				}
-			}
-		} else
-		{
-			in_next = nullptr;
-			out_next = nullptr;
-			result = facet.in(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
-		}
-		if(result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end))
-		{
-			out.resize(out.size() * 2);
-			in_begin = in_next;
-			out_begin = &(out[0]) + (out_next - out_begin);
-			out_end = &(out[0]) + out.size();
-			continue;
-		}
-		if(retry == 0)
-		{
-			if(result == codecvt_type::error && in_next == in_begin && out_next == out_begin)
-			{
-				bool made_progress = true;
-				LocaleDecode(std::string(" ") + str, locale, replacement, 1, &made_progress);
-				if(!made_progress)
-				{
-					return LocaleDecode(str, locale, replacement, 2);
-				}
-			}
-		} else if(retry == 1)
-		{
-			if(result == codecvt_type::error && in_next == in_begin && out_next == out_begin)
-			{
-				*progress = false;
-			} else
-			{
-				*progress = true;
-			}
-			return std::wstring();
-		}
-		if(result == codecvt_type::error)
-		{
-			++in_next;
-			*out_next = replacement;
-			++out_next;
-		}
-		in_begin = in_next;
-		out_begin = out_next;
-	} while((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
-	return std::wstring(&(out[0]), out_next);
-}
-
-static std::string LocaleEncode(const std::wstring &str, const std::locale & locale, char replacement = '?', int retry = 0, bool * progress = nullptr)
-{
-	if(str.empty())
-	{
-		return std::string();
-	}
-	std::vector<char> out;
-	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
-	std::mbstate_t state = std::mbstate_t();
-	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
-	codecvt_type::result result = codecvt_type::partial;
-	const wchar_t * in_begin = str.data();
-	const wchar_t * in_end = in_begin + str.size();
-	out.resize((in_end - in_begin) * (mpt::saturate_cast<std::size_t>(facet.max_length()) + 1));
-	char * out_begin = &(out[0]);
-	char * out_end = &(out[0]) + out.size();
-	const wchar_t * in_next = nullptr;
-	char * out_next = nullptr;
-	do
-	{
-		if(retry == 2)
-		{
-			for(;;)
-			{
-				in_next = nullptr;
-				out_next = nullptr;
-				result = facet.out(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
-				if(result == codecvt_type::partial && in_next == in_begin + 1)
-				{
-					in_begin = in_next;
-					out_begin = out_next;
-					continue;
-				} else
-				{
-					break;
-				}
-			}
-		} else
-		{
-			in_next = nullptr;
-			out_next = nullptr;
-			result = facet.out(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
-		}
-		if(result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end))
-		{
-			out.resize(out.size() * 2);
-			in_begin = in_next;
-			out_begin = &(out[0]) + (out_next - out_begin);
-			out_end = &(out[0]) + out.size();
-			continue;
-		}
-		if(retry == 0)
-		{
-			if(result == codecvt_type::error && in_next == in_begin && out_next == out_begin)
-			{
-				bool made_progress = true;
-				LocaleEncode(std::wstring(L" ") + str, locale, replacement, 1, &made_progress);
-				if(!made_progress)
-				{
-					return LocaleEncode(str, locale, replacement, 2);
-				}
-			}
-		} else if(retry == 1)
-		{
-			if(result == codecvt_type::error && in_next == in_begin && out_next == out_begin)
-			{
-				*progress = false;
-			} else
-			{
-				*progress = true;
-			}
-			return std::string();
-		}
-		if(result == codecvt_type::error)
-		{
-			++in_next;
-			*out_next = replacement;
-			++out_next;
-		}
-		in_begin = in_next;
-		out_begin = out_next;
-	} while((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
-	return std::string(&(out[0]), out_next);
-}
-
-
-template <typename Tsrcstring>
-static std::wstring FromLocale(const Tsrcstring &str, wchar_t replacement = L'\uFFFD')
-{
-	std::string tmp(str.begin(), str.end());
-	return String::LocaleDecode(tmp, std::locale(""), replacement);
-}
-template <>
-std::wstring FromLocale<std::string>(const std::string &str, wchar_t replacement)
-{
-	return String::LocaleDecode(str, std::locale(""), replacement);
-}
-
-template <typename Tdststring>
-static Tdststring ToLocale(const std::wstring &str, char replacement = '?')
-{
-	std::string tmp = String::LocaleEncode(str, std::locale(""), replacement);
-	return Tdststring(tmp.begin(), tmp.end());
-}
-template <>
-std::string ToLocale(const std::wstring &str, char replacement)
-{
-	return String::LocaleEncode(str, std::locale(""), replacement);
-}
-
-
-#endif // MPT_ENABLE_CHARSET_LOCALE && !MPT_LOCALE_ASSUME_CHARSET
-
-template <typename Tsrcstring>
-static mpt::wstring FromUTF8(const Tsrcstring &str, mpt::wchar replacement = MPT_WCHAR('\uFFFD'))
-{
-	const Tsrcstring &in = str;
-
-	mpt::wstring out;
-
-	// state:
-	std::size_t charsleft = 0;
-	char32_t ucs4 = 0;
-
-	for ( uint8 c : in ) {
-
-		if ( charsleft == 0 ) {
-
-			if ( ( c & 0x80 ) == 0x00 ) {
-				out.push_back( (mpt::wchar)c );
-			} else if ( ( c & 0xE0 ) == 0xC0 ) {
-				ucs4 = c & 0x1F;
-				charsleft = 1;
-			} else if ( ( c & 0xF0 ) == 0xE0 ) {
-				ucs4 = c & 0x0F;
-				charsleft = 2;
-			} else if ( ( c & 0xF8 ) == 0xF0 ) {
-				ucs4 = c & 0x07;
-				charsleft = 3;
-			} else {
-				out.push_back( replacement );
-				ucs4 = 0;
-				charsleft = 0;
-			}
-
-		} else {
-
-			if ( ( c & 0xC0 ) != 0x80 ) {
-				out.push_back( replacement );
-				ucs4 = 0;
-				charsleft = 0;
-			}
-			ucs4 <<= 6;
-			ucs4 |= c & 0x3F;
-			charsleft--;
-
-			if ( charsleft == 0 ) {
-				if constexpr ( sizeof( mpt::wchar ) == 2 ) {
-					if ( ucs4 > 0x1fffff ) {
-						out.push_back( replacement );
-						ucs4 = 0;
-						charsleft = 0;
-					}
-					if ( ucs4 <= 0xffff ) {
-						out.push_back( static_cast<mpt::wchar>(ucs4) );
-					} else {
-						uint32 surrogate = static_cast<uint32>(ucs4) - 0x10000;
-						uint16 hi_sur = static_cast<uint16>( ( 0x36 << 10 ) | ( (surrogate>>10) & ((1<<10)-1) ) );
-						uint16 lo_sur = static_cast<uint16>( ( 0x37 << 10 ) | ( (surrogate>> 0) & ((1<<10)-1) ) );
-						out.push_back( hi_sur );
-						out.push_back( lo_sur );
-					}
-				} else {
-					out.push_back( static_cast<mpt::wchar>( ucs4 ) );
-				}
-				ucs4 = 0;
-			}
-
-		}
-
-	}
-
-	if ( charsleft != 0 ) {
-		out.push_back( replacement );
-		ucs4 = 0;
-		charsleft = 0;
-	}
-
-	return out;
-
-}
-
-template <typename Tdststring>
-static Tdststring ToUTF8(const mpt::wstring &str, char replacement = '?')
-{
-	const mpt::wstring &in = str;
-
-	Tdststring out;
-
-	for ( std::size_t i=0; i<in.length(); i++ ) {
-
-		mpt::wchar wc = in[i];
-
-		char32_t ucs4 = 0;
-		if constexpr ( sizeof( mpt::wchar ) == 2 ) {
-			uint16 c = static_cast<uint16>( wc );
-			if ( i + 1 < in.length() ) {
-				// check for surrogate pair
-				uint16 hi_sur = in[i+0];
-				uint16 lo_sur = in[i+1];
-				if ( hi_sur >> 10 == 0x36 && lo_sur >> 10 == 0x37 ) {
-					// surrogate pair
-					++i;
-					hi_sur &= (1<<10)-1;
-					lo_sur &= (1<<10)-1;
-					ucs4 = ( static_cast<uint32>(hi_sur) << 10 ) | ( static_cast<uint32>(lo_sur) << 0 );
-				} else {
-					// no surrogate pair
-					ucs4 = static_cast<char32_t>( c );
-				}
-			} else {
-				// no surrogate possible
-				ucs4 = static_cast<char32_t>( c );
-			}
-		} else {
-			ucs4 = static_cast<char32_t>( wc );
-		}
-		
-		if ( ucs4 > 0x1fffff ) {
-			out.push_back( replacement );
-			continue;
-		}
-
-		uint8 utf8[6];
-		std::size_t numchars = 0;
-		for ( numchars = 0; numchars < 6; numchars++ ) {
-			utf8[numchars] = ucs4 & 0x3F;
-			ucs4 >>= 6;
-			if ( ucs4 == 0 ) {
-				break;
-			}
-		}
-		numchars++;
-
-		if ( numchars == 1 ) {
-			out.push_back( utf8[0] );
-			continue;
-		}
-
-		if ( numchars == 2 && utf8[numchars-1] == 0x01 ) {
-			// generate shortest form
-			out.push_back( utf8[0] | 0x40 );
-			continue;
-		}
-
-		std::size_t charsleft = numchars;
-		while ( charsleft > 0 ) {
-			if ( charsleft == numchars ) {
-				out.push_back( utf8[ charsleft - 1 ] | ( ((1<<numchars)-1) << (8-numchars) ) );
-			} else {
-				// cppcheck false-positive
-				// cppcheck-suppress arrayIndexOutOfBounds
-				out.push_back( utf8[ charsleft - 1 ] | 0x80 );
-			}
-			charsleft--;
-		}
-
-	}
-
-	return out;
-
-}
-
-
-#if MPT_OS_DJGPP && defined(MPT_ENABLE_CHARSET_LOCALE)
-
-static mpt::Charset DJGPP_GetLocaleCharset()
-{
-	uint16 active_codepage = 437;
-	uint16 system_codepage = 437;
-	__dpmi_regs regs;
-	std::memset(&regs, 0, sizeof(__dpmi_regs));
-	regs.x.ax = 0x6601;
-	if(__dpmi_int( 0x21, &regs ) == 0)
-	{
-		int cf = (regs.x.flags >> 0) & 1;
-		if(cf == 0)
-		{
-			active_codepage = regs.x.bx;
-			system_codepage = regs.x.dx;
-		}
-	}
-	mpt::Charset result = mpt::Charset::CP437;
-	if(active_codepage == 0)
-	{
-		result = mpt::Charset::CP437;
-	} else if(active_codepage == 437)
-	{
-		result = mpt::Charset::CP437;
-	} else if(active_codepage == 850)
-	{
-		result = mpt::Charset::CP850;
-	} else if(system_codepage == 437)
-	{
-		result = mpt::Charset::CP437;
-	} else if(system_codepage == 850)
-	{
-		result = mpt::Charset::CP850;
-	} else
-	{
-		result = mpt::Charset::CP437;
-	}
-	return result;
-}
-
-#endif // MPT_OS_DJGPP && MPT_ENABLE_CHARSET_LOCALE
-
-
 // templated on 8bit strings because of type-safe variants
 template<typename Tdststring>
-static Tdststring EncodeImpl(Charset charset, const mpt::wstring &src)
+static Tdststring EncodeImpl(Charset charset, const mpt::widestring &src)
 {
 	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
 	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
-	#if defined(MPT_ENABLE_CHARSET_LOCALE)
-		#if defined(MPT_LOCALE_ASSUME_CHARSET)
-			if(charset == Charset::Locale)
-			{
-				charset = MPT_LOCALE_ASSUME_CHARSET;
-			}
-		#endif
-	#endif
-	#if MPT_OS_WINDOWS
-		if(HasCharset(charset))
-		{
-			return EncodeCodepage<Tdststring>(CharsetToCodepage(charset), src);
-		}
-	#endif
 	switch(charset)
 	{
 #if defined(MPT_ENABLE_CHARSET_LOCALE)
-	#if defined(MPT_LOCALE_ASSUME_CHARSET)
-		case Charset::Locale:      MPT_ASSERT_NOTREACHED(); break;
-	#else
-		case Charset::Locale:      return String::ToLocale<Tdststring>(src); break;
-	#endif
+		case Charset::Locale:      return mpt::encode<Tdststring>(mpt::logical_encoding::locale, src); break;
 #endif
-		case Charset::UTF8:        return String::ToUTF8<Tdststring>(src); break;
-		case Charset::ASCII:       return String::ToAscii<Tdststring>(src); break;
-		case Charset::ISO8859_1:   return String::ToISO_8859_1<Tdststring>(src); break;
-		case Charset::ISO8859_15:  return String::To8bit<Tdststring>(src, CharsetTableISO8859_15); break;
-		case Charset::CP850:       return String::To8bit<Tdststring>(src, CharsetTableCP850); break;
-		case Charset::CP437:       return String::To8bit<Tdststring>(src, CharsetTableCP437); break;
-		case Charset::CP437AMS:    return String::To8bit<Tdststring>(src, CharsetTableCP437AMS); break;
-		case Charset::CP437AMS2:   return String::To8bit<Tdststring>(src, CharsetTableCP437AMS2); break;
-		case Charset::Windows1252: return String::To8bit<Tdststring>(src, CharsetTableWindows1252); break;
+		case Charset::UTF8:        return mpt::encode<Tdststring>(mpt::common_encoding::utf8, src); break;
+		case Charset::ASCII:       return mpt::encode<Tdststring>(mpt::common_encoding::ascii, src); break;
+		case Charset::ISO8859_1:   return mpt::encode<Tdststring>(mpt::common_encoding::iso8859_1, src); break;
+		case Charset::ISO8859_15:  return mpt::encode<Tdststring>(mpt::common_encoding::iso8859_15, src); break;
+		case Charset::CP850:       return mpt::encode<Tdststring>(mpt::common_encoding::cp850, src); break;
+		case Charset::CP437:       return mpt::encode<Tdststring>(mpt::common_encoding::cp437, src); break;
+		case Charset::CP437AMS:    return mpt::encode<Tdststring>(CharsetTableCP437AMS, src); break;
+		case Charset::CP437AMS2:   return mpt::encode<Tdststring>(CharsetTableCP437AMS2, src); break;
+		case Charset::Windows1252: return mpt::encode<Tdststring>(mpt::common_encoding::windows1252, src); break;
 	}
 	return Tdststring();
 }
@@ -1128,44 +377,26 @@
 
 // templated on 8bit strings because of type-safe variants
 template<typename Tsrcstring>
-static mpt::wstring DecodeImpl(Charset charset, const Tsrcstring &src)
+static mpt::widestring DecodeImpl(Charset charset, const Tsrcstring &src)
 {
 	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
 	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
-	#if defined(MPT_ENABLE_CHARSET_LOCALE)
-		#if defined(MPT_LOCALE_ASSUME_CHARSET)
-			if(charset == Charset::Locale)
-			{
-				charset = MPT_LOCALE_ASSUME_CHARSET;
-			}
-		#endif
-	#endif
-	#if MPT_OS_WINDOWS
-		if(HasCharset(charset))
-		{
-			return DecodeCodepage<Tsrcstring>(CharsetToCodepage(charset), src);
-		}
-	#endif
 	switch(charset)
 	{
 #if defined(MPT_ENABLE_CHARSET_LOCALE)
-	#if defined(MPT_LOCALE_ASSUME_CHARSET)
-		case Charset::Locale:      MPT_ASSERT_NOTREACHED(); break;
-	#else
-		case Charset::Locale:      return String::FromLocale<Tsrcstring>(src); break;
-	#endif
+		case Charset::Locale:      return mpt::decode<Tsrcstring>(mpt::logical_encoding::locale, src); break;
 #endif
-		case Charset::UTF8:        return String::FromUTF8<Tsrcstring>(src); break;
-		case Charset::ASCII:       return String::FromAscii<Tsrcstring>(src); break;
-		case Charset::ISO8859_1:   return String::FromISO_8859_1<Tsrcstring>(src); break;
-		case Charset::ISO8859_15:  return String::From8bit<Tsrcstring>(src, CharsetTableISO8859_15); break;
-		case Charset::CP850:       return String::From8bit<Tsrcstring>(src, CharsetTableCP850); break;
-		case Charset::CP437:       return String::From8bit<Tsrcstring>(src, CharsetTableCP437); break;
-		case Charset::CP437AMS:    return String::From8bit<Tsrcstring>(src, CharsetTableCP437AMS); break;
-		case Charset::CP437AMS2:   return String::From8bit<Tsrcstring>(src, CharsetTableCP437AMS2); break;
-		case Charset::Windows1252: return String::From8bit<Tsrcstring>(src, CharsetTableWindows1252); break;
+		case Charset::UTF8:        return mpt::decode<Tsrcstring>(mpt::common_encoding::utf8, src); break;
+		case Charset::ASCII:       return mpt::decode<Tsrcstring>(mpt::common_encoding::ascii, src); break;
+		case Charset::ISO8859_1:   return mpt::decode<Tsrcstring>(mpt::common_encoding::iso8859_1, src); break;
+		case Charset::ISO8859_15:  return mpt::decode<Tsrcstring>(mpt::common_encoding::iso8859_15, src); break;
+		case Charset::CP850:       return mpt::decode<Tsrcstring>(mpt::common_encoding::cp850, src); break;
+		case Charset::CP437:       return mpt::decode<Tsrcstring>(mpt::common_encoding::cp437, src); break;
+		case Charset::CP437AMS:    return mpt::decode<Tsrcstring>(CharsetTableCP437AMS, src); break;
+		case Charset::CP437AMS2:   return mpt::decode<Tsrcstring>(CharsetTableCP437AMS2, src); break;
+		case Charset::Windows1252: return mpt::decode<Tsrcstring>(mpt::common_encoding::windows1252, src); break;
 	}
-	return mpt::wstring();
+	return mpt::widestring();
 }
 
 
@@ -1191,7 +422,7 @@
 
 bool IsUTF8(const std::string &str)
 {
-	return (str == String::EncodeImpl<std::string>(mpt::Charset::UTF8, String::DecodeImpl<std::string>(mpt::Charset::UTF8, str)));
+	return mpt::is_utf8(str);
 }
 
 
@@ -1451,9 +682,9 @@
 		mpt::ustring result;
 		bool noCharsetMatch = true;
 		mpt::Charset charset = mpt::CharsetFromCodePage(codepage, fallback, &noCharsetMatch);
-		if(noCharsetMatch && mpt::String::TestCodePage(codepage))
+		if(noCharsetMatch && mpt::has_codepage(codepage))
 		{
-			result = mpt::ToUnicode(mpt::String::DecodeCodepage<std::string>(codepage, str));
+			result = mpt::ToUnicode(mpt::decode<std::string>(codepage, str));
 		} else
 		{
 			result = mpt::ToUnicode(charset, str);
@@ -1470,20 +701,12 @@
 
 char ToLowerCaseAscii(char c)
 {
-	if('A' <= c && c <= 'Z')
-	{
-		c += 'a' - 'A';
-	}
-	return c;
+	return mpt::to_lower_ascii(c);
 }
 
 char ToUpperCaseAscii(char c)
 {
-	if('a' <= c && c <= 'z')
-	{
-		c -= 'a' - 'A';
-	}
-	return c;
+	return mpt::to_upper_ascii(c);
 }
 
 std::string ToLowerCaseAscii(std::string s)
Index: common/mptString.h
===================================================================
--- common/mptString.h	(revision 14628)
+++ common/mptString.h	(working copy)
@@ -12,6 +12,9 @@
 
 #include "BuildSettings.h"
 
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
 #include "mptAlloc.h"
 #include "mptBaseTypes.h"
 #include "mptSpan.h"
@@ -24,6 +27,7 @@
 #include <cstring>
 
 
+
 OPENMPT_NAMESPACE_BEGIN
 
 
@@ -32,146 +36,22 @@
 
 
 
-template <typename T> inline span<T> as_span(std::basic_string<T> & str)
-{
-	return span<T>(str.data(), str.size());
-}
 
-template <typename T> inline span<const T> as_span(const std::basic_string<T> & str)
-{
-	return span<const T>(str.data(), str.size());
-}
 
-
-
-template <typename T> inline std::vector<typename std::remove_const<T>::type> make_vector(const std::basic_string<T> & str)
-{
-	return std::vector<typename std::remove_const<T>::type>(str.begin(), str.end());
-}
-
-
-
-template <typename T> inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T * beg, T * end)
-{
-	return std::basic_string<typename std::remove_const<T>::type>(beg, end);
-}
-
-template <typename T> inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T * data, std::size_t size)
-{
-	return std::basic_string<typename std::remove_const<T>::type>(data, data + size);
-}
-
-template <typename T> inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(mpt::span<T> data)
-{
-	return std::basic_string<typename std::remove_const<T>::type>(data.data(), data.data() + data.size());
-}
-
-template <typename T, std::size_t N> inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T (&arr)[N])
-{
-	return std::basic_string<typename std::remove_const<T>::type>(std::begin(arr), std::end(arr));
-}
-
-template <typename T> inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(const std::vector<T> & str)
-{
-	return std::vector<typename std::remove_const<T>::type>(str.begin(), str.end());
-}
-
-
-template <typename T>
-MPT_CONSTEXPRINLINE unsigned char char_value(T x) noexcept = delete;
-template <>
-MPT_CONSTEXPRINLINE unsigned char char_value<char>(char x) noexcept
-{
-	return static_cast<unsigned char>(x);
-}
-template <>
-MPT_CONSTEXPRINLINE unsigned char char_value<unsigned char>(unsigned char x) noexcept
-{
-	return static_cast<unsigned char>(x);
-}
-#if MPT_CXX_AT_LEAST(20)
-template <>
-MPT_CONSTEXPRINLINE unsigned char char_value<char8_t>(char8_t x) noexcept
-{
-	return static_cast<unsigned char>(x);
-}
-#endif // C++20
-
-
-// string_traits abstract the API of underlying string classes, in particular they allow adopting to CString without having to specialize for CString explicitly 
-
-template <typename Tstring>
-struct string_traits
-{
-
-	using string_type = Tstring;
-	using size_type = typename string_type::size_type;
-	using char_type = typename string_type::value_type;
-
-	static inline std::size_t length(const string_type &str) { return str.length(); }
-
-	static inline void reserve(string_type &str, std::size_t size) { str.reserve(size); }
-
-	static inline string_type& append(string_type &str, const string_type &a) { return str.append(a); }
-	static inline string_type& append(string_type &str, string_type &&a) { return str.append(std::move(a)); }
-	static inline string_type& append(string_type &str, std::size_t count, char_type c) { return str.append(count, c); }
-
-	static inline string_type pad(string_type str, std::size_t left, std::size_t right)
-	{
-		str.insert(str.begin(), left, char_type(' '));
-		str.insert(str.end(), right, char_type(' '));
-		return str;
-	}
-
-};
-
-#if defined(MPT_WITH_MFC)
-template <>
-struct string_traits<CString>
-{
-
-	using string_type = CString;
-	using size_type = int;
-	using char_type = typename CString::XCHAR;
-
-	static inline size_type length(const string_type &str) { return str.GetLength(); }
-
-	static inline void reserve(string_type &str, size_type size) { str.Preallocate(size); }
-
-	static inline string_type& append(string_type &str, const string_type &a) { str += a; return str; }
-	static inline string_type& append(string_type &str, size_type count, char_type c) { while(count--) str.AppendChar(c); return str; }
-
-	static inline string_type pad(const string_type &str, size_type left, size_type right)
-	{
-		CString tmp;
-		while(left--) tmp.AppendChar(char_type(' '));
-		tmp += str;
-		while(right--) tmp.AppendChar(char_type(' '));
-		return tmp;
-	}
-
-};
-#endif // MPT_WITH_MFC
-
-
-
 namespace String
 {
 
 
 template <typename Tstring> struct Traits {
-	static MPT_FORCEINLINE const char * GetDefaultWhitespace() noexcept { return " \n\r\t"; }
 	static MPT_FORCEINLINE bool IsLineEnding(char c) noexcept { return c == '\r' || c == '\n'; }
 };
 
 template <> struct Traits<std::string> {
-	static MPT_FORCEINLINE const char * GetDefaultWhitespace() noexcept { return " \n\r\t"; }
 	static MPT_FORCEINLINE bool IsLineEnding(char c) noexcept { return c == '\r' || c == '\n'; }
 };
 
-#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#if !MPT_COMPILER_QUIRK_NO_WCHAR
 template <> struct Traits<std::wstring> {
-	static MPT_FORCEINLINE const wchar_t * GetDefaultWhitespace() noexcept { return L" \n\r\t"; }
 	static MPT_FORCEINLINE bool IsLineEnding(wchar_t c) noexcept { return c == L'\r' || c == L'\n'; }
 };
 #endif // !MPT_COMPILER_QUIRK_NO_WCHAR
@@ -179,41 +59,23 @@
 
 // Remove whitespace at start of string
 template <typename Tstring>
-inline Tstring LTrim(Tstring str, const Tstring &whitespace = Tstring(mpt::String::Traits<Tstring>::GetDefaultWhitespace()))
+inline Tstring LTrim(Tstring str, const Tstring & whitespace = mpt::default_whitespace<Tstring>())
 {
-	typename Tstring::size_type pos = str.find_first_not_of(whitespace);
-	if(pos != Tstring::npos)
-	{
-		str.erase(str.begin(), str.begin() + pos);
-	} else if(pos == Tstring::npos && str.length() > 0 && str.find_last_of(whitespace) == str.length() - 1)
-	{
-		return Tstring();
-	}
-	return str;
+	return mpt::trim_left(str, whitespace);
 }
 
-
 // Remove whitespace at end of string
 template <typename Tstring>
-inline Tstring RTrim(Tstring str, const Tstring &whitespace = Tstring(mpt::String::Traits<Tstring>::GetDefaultWhitespace()))
+inline Tstring RTrim(Tstring str, const Tstring& whitespace = mpt::default_whitespace<Tstring>())
 {
-	typename Tstring::size_type pos = str.find_last_not_of(whitespace);
-	if(pos != Tstring::npos)
-	{
-		str.erase(str.begin() + pos + 1, str.end());
-	} else if(pos == Tstring::npos && str.length() > 0 && str.find_first_of(whitespace) == 0)
-	{
-		return Tstring();
-	}
-	return str;
+	return mpt::trim_right(str, whitespace);
 }
 
-
 // Remove whitespace at start and end of string
 template <typename Tstring>
-inline Tstring Trim(Tstring str, const Tstring &whitespace = Tstring(mpt::String::Traits<Tstring>::GetDefaultWhitespace()))
+inline Tstring Trim(Tstring str, const Tstring& whitespace = mpt::default_whitespace<Tstring>())
 {
-	return RTrim(LTrim(str, whitespace), whitespace);
+	return mpt::trim(str, whitespace);
 }
 
 
@@ -308,83 +170,7 @@
 bool IsUTF8(const std::string &str);
 
 
-#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
-using wstring = std::wstring;
-using wchar = wchar_t;
-#define MPT_WCHAR(x)     L ## x
-#define MPT_WLITERAL(x)  L ## x
-#define MPT_WSTRING(x)   std::wstring( L ## x )
-#else // MPT_COMPILER_QUIRK_NO_WCHAR
-using wstring = std::u32string;
-using wchar = char32_t;
-#define MPT_WCHAR(x)     U ## x
-#define MPT_WLITERAL(x)  U ## x
-#define MPT_WSTRING(x)   std::u32string( U ## x )
-#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
 
-
-template <mpt::Charset charset_tag>
-struct charset_char_traits : std::char_traits<char> {
-	static constexpr mpt::Charset charset() noexcept { return charset_tag; }
-};
-
-
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-
-using lstring = std::basic_string<char, mpt::charset_char_traits<mpt::Charset::Locale>>;
-
-#endif // MPT_ENABLE_CHARSET_LOCALE
-
-#if MPT_OS_WINDOWS
-
-template <typename Tchar> struct windows_char_traits { };
-template <> struct windows_char_traits<char>  { using string_type = mpt::lstring; };
-template <> struct windows_char_traits<wchar_t> { using string_type = std::wstring; };
-
-#ifdef UNICODE
-using tstring = windows_char_traits<wchar_t>::string_type;
-#else
-using tstring = windows_char_traits<char>::string_type;
-#endif
-
-using winstring = mpt::tstring;
-
-#endif // MPT_OS_WINDOWS
-
-
-#if MPT_CXX_AT_LEAST(20)
-
-using u8string = std::u8string;
-using u8char = char8_t;
-#define MPT_U8CHAR(x)    u8 ## x
-#define MPT_U8LITERAL(x) u8 ## x
-#define MPT_U8STRING(x)  std::u8string( u8 ## x )
-
-#else // !C++20
-
-using u8string = std::basic_string<char, mpt::charset_char_traits<mpt::Charset::UTF8>>;
-using u8char = char;
-#define MPT_U8CHAR(x)    x
-#define MPT_U8LITERAL(x) x
-#define MPT_U8STRING(x)  mpt::u8string( x )
-
-// mpt::u8string is a moderately type-safe string that is meant to contain
-// UTF-8 encoded char bytes.
-//
-// mpt::u8string is not implicitely convertible to/from std::string, but
-// it is convertible to/from C strings the same way as std::string is.
-//
-// The implementation of mpt::u8string is a compromise of compatibilty
-// with implementation-defined STL details, efficiency, source code size,
-// executable bloat, type-safety  and simplicity.
-//
-// mpt::u8string is not meant to be used directly though.
-// mpt::u8string is meant as an alternative implementaion to std::wstring
-// for implementing the unicode string type mpt::ustring.
-
-#endif // C++20
-
-
 #if MPT_WSTRING_CONVERT
 // Convert to a wide character string.
 // The wide encoding is UTF-16 or UTF-32, based on sizeof(wchar_t).
@@ -468,57 +254,13 @@
 #endif // MPT_WITH_MFC
 
 
-// mpt::ustring
-//
-// mpt::ustring is a string type that can hold unicode strings.
-// It is implemented as a std::basic_string either based on wchar_t (i.e. the
-//  same as std::wstring) or a custom-defined char_traits class that is derived
-//  from std::char_traits<char>.
-// The selection of the underlying implementation is done at compile-time.
-// MPT_UCHAR, MPT_ULITERAL and MPT_USTRING are macros that ease construction
-//  of ustring char literals, ustring char array literals and ustring objects
-//  from ustring char literals that work consistently in both modes.
-//  Note that these are not supported for non-ASCII characters appearing in
-//  the macro argument.
-// Also note that, as both UTF8 and UTF16 (it is less of an issue for UTF32)
-//  are variable-length encodings and mpt::ustring is implemented as a
-//  std::basic_string, all member functions that require individual character
-//  access will not work consistently or even at all in a meaningful way.
-//  This in particular affects operator[], at(), find() and substr().
-//  The code makes no effort in preventing these or generating warnings when
-//  these are used on mpt::ustring objects. However, compiling in the
-//  respectively other mpt::ustring mode will catch most of these anyway.
 
-#if MPT_USTRING_MODE_WIDE
-#if MPT_USTRING_MODE_UTF8
-#error "MPT_USTRING_MODE_WIDE and MPT_USTRING_MODE_UTF8 are mutually exclusive."
-#endif
-
-using ustring = std::wstring;
-using uchar = wchar_t;
-#define MPT_UCHAR(x)     L ## x
-#define MPT_ULITERAL(x)  L ## x
-#define MPT_USTRING(x)   std::wstring( L ## x )
-
-#endif // MPT_USTRING_MODE_WIDE
-
-#if MPT_USTRING_MODE_UTF8
-#if MPT_USTRING_MODE_WIDE
-#error "MPT_USTRING_MODE_WIDE and MPT_USTRING_MODE_UTF8 are mutually exclusive."
-#endif
-
-using ustring = mpt::u8string;
-using uchar = mpt::u8char;
-#define MPT_UCHAR(x)     MPT_U8CHAR( x )
-#define MPT_ULITERAL(x)  MPT_U8LITERAL( x )
-#define MPT_USTRING(x)   MPT_U8STRING( x )
-
-#endif // MPT_USTRING_MODE_UTF8
-
 #define UC_(x)           MPT_UCHAR(x)
 #define UL_(x)           MPT_ULITERAL(x)
 #define U_(x)            MPT_USTRING(x)
 
+
+
 #if MPT_USTRING_MODE_WIDE
 #if !(MPT_WSTRING_CONVERT)
 #error "MPT_USTRING_MODE_WIDE depends on MPT_WSTRING_CONVERT)"
@@ -570,12 +312,16 @@
 #endif // MPT_WITH_MFC
 #endif // MPT_USTRING_MODE_WIDE
 
+
+
+
+
 // The MPT_UTF8 allows specifying UTF8 char arrays.
 // The resulting type is mpt::ustring and the construction might require runtime translation,
 // i.e. it is NOT generally available at compile time.
 // Use explicit UTF8 encoding,
 // i.e. U+00FC (LATIN SMALL LETTER U WITH DIAERESIS) would be written as "\xC3\xBC".
-#define MPT_UTF8(x) mpt::ToUnicode(mpt::Charset::UTF8, x )
+#define MPT_UTF8(x) mpt::ToUnicode(mpt::Charset::UTF8, x)
 
 
 
Index: common/mptStringBuffer.h
===================================================================
--- common/mptStringBuffer.h	(revision 14628)
+++ common/mptStringBuffer.h	(working copy)
@@ -13,6 +13,8 @@
 
 #include "BuildSettings.h"
 
+#include "mpt/string/buffer.hpp"
+
 #include "mptMemory.h"
 #include "mptString.h"
 
@@ -63,184 +65,17 @@
 
 
 
-template <typename Tstring, typename Tchar>
-class StringBufRefImpl
-{
-private:
-	Tchar * buf;
-	std::size_t size;
-public:
-	// cppcheck false-positive
-	// cppcheck-suppress uninitMemberVar
-	explicit StringBufRefImpl(Tchar * buf_, std::size_t size_)
-		: buf(buf_)
-		, size(size_)
-	{
-		static_assert(sizeof(Tchar) == sizeof(typename Tstring::value_type));
-		MPT_ASSERT(size > 0);
-	}
-	StringBufRefImpl(const StringBufRefImpl &) = delete;
-	StringBufRefImpl(StringBufRefImpl &&) = default;
-	StringBufRefImpl & operator = (const StringBufRefImpl &) = delete;
-	StringBufRefImpl & operator = (StringBufRefImpl &&) = delete;
-	operator Tstring () const
-	{
-		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
-		return Tstring(buf, buf + len);
-	}
-	bool empty() const
-	{
-		return buf[0] == Tchar('\0');
-	}
-	StringBufRefImpl & operator = (const Tstring & str)
-	{
-		std::copy(str.data(), str.data() + std::min(str.length(), size - 1), buf);
-		std::fill(buf + std::min(str.length(), size - 1), buf + size, Tchar('\0'));
-		return *this;
-	}
-};
-
-template <typename Tstring, typename Tchar>
-class StringBufRefImpl<Tstring, const Tchar>
-{
-private:
-	const Tchar * buf;
-	std::size_t size;
-public:
-	// cppcheck false-positive
-	// cppcheck-suppress uninitMemberVar
-	explicit StringBufRefImpl(const Tchar * buf_, std::size_t size_)
-		: buf(buf_)
-		, size(size_)
-	{
-		static_assert(sizeof(Tchar) == sizeof(typename Tstring::value_type));
-		MPT_ASSERT(size > 0);
-	}
-	StringBufRefImpl(const StringBufRefImpl &) = delete;
-	StringBufRefImpl(StringBufRefImpl &&) = default;
-	StringBufRefImpl & operator = (const StringBufRefImpl &) = delete;
-	StringBufRefImpl & operator = (StringBufRefImpl &&) = delete;
-	operator Tstring () const
-	{
-		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
-		return Tstring(buf, buf + len);
-	}
-	bool empty() const
-	{
-		return buf[0] == Tchar('\0');
-	}
-};
-
 namespace String {
-template <typename Tstring, typename Tchar, std::size_t size>
-inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const std::array<Tchar, size> &buf)
-{
-	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf.data(), size);
-}
-template <typename Tstring, typename Tchar, std::size_t size>
-inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const Tchar (&buf)[size])
-{
-	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf, size);
-}
-template <typename Tstring, typename Tchar>
-inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const Tchar * buf, std::size_t size)
-{
-	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf, size);
-}
-template <typename Tstring, typename Tchar, std::size_t size>
-inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(std::array<Tchar, size> &buf)
-{
-	return StringBufRefImpl<Tstring, Tchar>(buf.data(), size);
-}
-template <typename Tstring, typename Tchar, std::size_t size>
-inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(Tchar (&buf)[size])
-{
-	return StringBufRefImpl<Tstring, Tchar>(buf, size);
-}
-template <typename Tstring, typename Tchar>
-inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(Tchar * buf, std::size_t size)
-{
-	return StringBufRefImpl<Tstring, Tchar>(buf, size);
-}
+using mpt::ReadTypedBuf;
+using mpt::WriteTypedBuf;
 } // namespace String
 
 namespace String {
-template <typename Tchar, std::size_t size>
-inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const std::array<Tchar, size> &buf)
-{
-	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf.data(), size);
-}
-template <typename Tchar, std::size_t size>
-inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const Tchar (&buf)[size])
-{
-	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf, size);
-}
-template <typename Tchar>
-inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const Tchar * buf, std::size_t size)
-{
-	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf, size);
-}
-template <typename Tchar, std::size_t size>
-inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(std::array<Tchar, size> &buf)
-{
-	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf.data(), size);
-}
-template <typename Tchar, std::size_t size>
-inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(Tchar (&buf)[size])
-{
-	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf, size);
-}
-template <typename Tchar>
-inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(Tchar * buf, std::size_t size)
-{
-	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf, size);
-}
+using mpt::ReadAutoBuf;
+using mpt::WriteAutoBuf;
 } // namespace String
 
-template <std::size_t len, mpt::String::ReadWriteMode mode = static_cast<mpt::String::ReadWriteMode>(0)> struct charbuf;
 
-template <std::size_t len>
-struct charbuf<len, static_cast<mpt::String::ReadWriteMode>(0)>
-{
-public:
-	typedef char Tchar;
-	using char_type = Tchar;
-	using string_type = std::basic_string<Tchar>;
-	constexpr std::size_t static_length() const { return len; }
-public:
-	Tchar buf[len];
-public:
-	charbuf()
-	{
-		Clear(buf);
-	}
-	charbuf(const charbuf &) = default;
-	charbuf(charbuf &&) = default;
-	charbuf & operator = (const charbuf &) = default;
-	charbuf & operator = (charbuf &&) = default;
-	const Tchar & operator[](std::size_t i) const { return buf[i]; }
-	std::string str() const { return static_cast<std::string>(*this); }
-	operator string_type () const
-	{
-		return mpt::String::ReadAutoBuf(buf);
-	}
-	bool empty() const
-	{
-		return mpt::String::ReadAutoBuf(buf).empty();
-	}
-	charbuf & operator = (const string_type & str)
-	{
-		mpt::String::WriteAutoBuf(buf) = str;
-		return *this;
-	}
-public:
-	friend bool operator!=(const std::string & a, const charbuf & b) { return a != b.str(); }
-	friend bool operator!=(const charbuf & a, const std::string & b) { return a.str() != b; }
-	friend bool operator!=(const charbuf & a, const charbuf & b) { return strncmp(a.buf, b.buf, len) != 0; }
-	friend bool operator==(const std::string & a, const charbuf & b) { return a == b.str(); }
-	friend bool operator==(const charbuf & a, const std::string & b) { return a.str() == b; }
-	friend bool operator==(const charbuf & a, const charbuf & b) { return strncmp(a.buf, b.buf, len) == 0; }
-};
 
 template <typename Tchar>
 class StringModeBufRefImpl
@@ -343,7 +178,7 @@
 } // namespace String
 
 template <std::size_t len, mpt::String::ReadWriteMode mode>
-struct charbuf
+struct modecharbuf
 {
 public:
 	typedef char Tchar;
@@ -352,11 +187,11 @@
 public:
 	Tchar buf[len];
 public:
-	charbuf() = default;
-	charbuf(const charbuf &) = default;
-	charbuf(charbuf &&) = default;
-	charbuf & operator = (const charbuf &) = default;
-	charbuf & operator = (charbuf &&) = default;
+	modecharbuf() = default;
+	modecharbuf(const modecharbuf &) = default;
+	modecharbuf(modecharbuf &&) = default;
+	modecharbuf & operator = (const modecharbuf &) = default;
+	modecharbuf & operator = (modecharbuf &&) = default;
 	operator string_type () const
 	{
 		return mpt::String::ReadBuf(mode, buf);
@@ -365,7 +200,7 @@
 	{
 		return mpt::String::ReadBuf(mode, buf).empty();
 	}
-	charbuf & operator = (const string_type & str)
+	modecharbuf & operator = (const string_type & str)
 	{
 		mpt::String::WriteBuf(mode, buf) = str;
 		return *this;
@@ -375,12 +210,11 @@
 
 // see MPT_BINARY_STRUCT
 template <std::size_t len, mpt::String::ReadWriteMode mode>
-struct is_binary_safe<typename mpt::charbuf<len, mode>> : public std::true_type { };
-template <std::size_t len>
-struct is_binary_safe<typename mpt::charbuf<len, static_cast<mpt::String::ReadWriteMode>(0)>> : public std::false_type { };
-static_assert(sizeof(mpt::charbuf<7>) == 7);
-static_assert(alignof(mpt::charbuf<7>) == 1);
-static_assert(std::is_standard_layout<mpt::charbuf<7>>::value);
+constexpr bool declare_binary_safe(const typename mpt::modecharbuf<len, mode> &) { return true; }
+//struct is_binary_safe<typename mpt::modecharbuf<len, mode>> : public std::true_type { };
+static_assert(sizeof(mpt::modecharbuf<7, mpt::String::ReadWriteMode::nullTerminated>) == 7);
+static_assert(alignof(mpt::modecharbuf<7, mpt::String::ReadWriteMode::nullTerminated>) == 1);
+static_assert(std::is_standard_layout<mpt::modecharbuf<7, mpt::String::ReadWriteMode::nullTerminated>>::value);
 
 
 #ifdef MODPLUG_TRACKER
@@ -388,129 +222,15 @@
 #if MPT_OS_WINDOWS
 
 namespace String {
-template <typename Tchar, std::size_t size>
-inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const std::array<Tchar, size> &buf)
-{
-	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf.data(), size);
-}
-template <typename Tchar, std::size_t size>
-inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const Tchar (&buf)[size])
-{
-	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf, size);
-}
-template <typename Tchar>
-inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const Tchar * buf, std::size_t size)
-{
-	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf, size);
-}
-template <typename Tchar, std::size_t size>
-inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(std::array<Tchar, size> &buf)
-{
-	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf.data(), size);
-}
-template <typename Tchar, std::size_t size>
-inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(Tchar (&buf)[size])
-{
-	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf, size);
-}
-template <typename Tchar>
-inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(Tchar * buf, std::size_t size)
-{
-	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf, size);
-}
+using mpt::ReadWinBuf;
+using mpt::WriteWinBuf;
 } // namespace String
 
 #if defined(MPT_WITH_MFC)
 
-template <typename Tchar>
-class CStringBufRefImpl
-{
-private:
-	Tchar * buf;
-	std::size_t size;
-public:
-	// cppcheck false-positive
-	// cppcheck-suppress uninitMemberVar
-	explicit CStringBufRefImpl(Tchar * buf_, std::size_t size_)
-		: buf(buf_)
-		, size(size_)
-	{
-		MPT_ASSERT(size > 0);
-	}
-	CStringBufRefImpl(const CStringBufRefImpl &) = delete;
-	CStringBufRefImpl(CStringBufRefImpl &&) = default;
-	CStringBufRefImpl & operator = (const CStringBufRefImpl &) = delete;
-	CStringBufRefImpl & operator = (CStringBufRefImpl &&) = delete;
-	operator CString () const
-	{
-		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
-		return CString(buf, mpt::saturate_cast<int>(len));
-	}
-	CStringBufRefImpl & operator = (const CString & str)
-	{
-		std::copy(str.GetString(), str.GetString() + std::min(static_cast<std::size_t>(str.GetLength()), size - 1), buf);
-		std::fill(buf + std::min(static_cast<std::size_t>(str.GetLength()), size - 1), buf + size, Tchar('\0'));
-		return *this;
-	}
-};
-
-template <typename Tchar>
-class CStringBufRefImpl<const Tchar>
-{
-private:
-	const Tchar * buf;
-	std::size_t size;
-public:
-	// cppcheck false-positive
-	// cppcheck-suppress uninitMemberVar
-	explicit CStringBufRefImpl(const Tchar * buf_, std::size_t size_)
-		: buf(buf_)
-		, size(size_)
-	{
-		MPT_ASSERT(size > 0);
-	}
-	CStringBufRefImpl(const CStringBufRefImpl &) = delete;
-	CStringBufRefImpl(CStringBufRefImpl &&) = default;
-	CStringBufRefImpl & operator = (const CStringBufRefImpl &) = delete;
-	CStringBufRefImpl & operator = (CStringBufRefImpl &&) = delete;
-	operator CString () const
-	{
-		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
-		return CString(buf, mpt::saturate_cast<int>(len));
-	}
-};
-
 namespace String {
-template <typename Tchar, std::size_t size>
-inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const std::array<Tchar, size> &buf)
-{
-	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf.data(), size);
-}
-template <typename Tchar, std::size_t size>
-inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const Tchar (&buf)[size])
-{
-	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf, size);
-}
-template <typename Tchar>
-inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const Tchar * buf, std::size_t size)
-{
-	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf, size);
-}
-template <typename Tchar, std::size_t size>
-inline CStringBufRefImpl<Tchar> WriteCStringBuf(std::array<Tchar, size> &buf)
-{
-	return CStringBufRefImpl<Tchar>(buf.data(), size);
-}
-template <typename Tchar, std::size_t size>
-inline CStringBufRefImpl<Tchar> WriteCStringBuf(Tchar (&buf)[size])
-{
-	return CStringBufRefImpl<Tchar>(buf, size);
-}
-template <typename Tchar>
-inline CStringBufRefImpl<Tchar> WriteCStringBuf(Tchar * buf, std::size_t size)
-{
-	return CStringBufRefImpl<Tchar>(buf, size);
-}
+using mpt::ReadCStringBuf;
+using mpt::WriteCStringBuf;
 } // namespace String
 
 #endif // MPT_WITH_MFC
@@ -548,7 +268,7 @@
 		buffer[size - 1] = 0;
 	}
 
-#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#if !MPT_COMPILER_QUIRK_NO_WCHAR
 
 	template <size_t size>
 	void SetNullTerminator(wchar_t (&buffer)[size])
Index: common/mptStringFormat.cpp
===================================================================
--- common/mptStringFormat.cpp	(revision 14628)
+++ common/mptStringFormat.cpp	(working copy)
@@ -10,194 +10,37 @@
 #include "stdafx.h"
 #include "mptStringFormat.h"
 
-#if MPT_MSVC_AT_LEAST(2019,4) || MPT_GCC_AT_LEAST(11,1,0)
-#define MPT_FORMAT_CXX17_FLOAT 1
-#else
-#define MPT_FORMAT_CXX17_FLOAT 0
-#endif
+#include "mpt/string/format_default_floatingpoint.hpp"
+#include "mpt/string/format_default_integer.hpp"
+#include "mpt/string/format_helpers.hpp"
+#include "mpt/string/format_simple_floatingpoint.hpp"
+#include "mpt/string/format_simple_integer.hpp"
 
-#include <charconv>
-#include <iomanip>
-#if MPT_FORMAT_CXX17_FLOAT
-#include <iterator>
-#endif // MPT_FORMAT_CXX17_FLOAT
-#include <locale>
-#include <sstream>
-#include <string>
-#include <system_error>
 
-
 OPENMPT_NAMESPACE_BEGIN
 
 
-
 namespace mpt
 {
 
 
 
-#if MPT_WSTRING_FORMAT
-static std::wstring ToWideSimple(const std::string &nstr)
-{
-	std::wstring wstr(nstr.size(), L'\0');
-	for(std::size_t i = 0; i < nstr.size(); ++i)
-	{
-		wstr[i] = static_cast<unsigned char>(nstr[i]);
-	}
-	return wstr;
-}
-#endif // MPT_WSTRING_FORMAT
+std::string ToString(const bool & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const signed char & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const unsigned char & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const signed short & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const unsigned short & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const signed int & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const unsigned int & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const signed long & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const unsigned long & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const signed long long & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const unsigned long long & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const float & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const double & x) { return mpt::format_value_default<std::string>(x); }
+std::string ToString(const long double & x) { return mpt::format_value_default<std::string>(x); }
 
-template<typename T>
-static inline std::string ToCharsInt(const T & x, int base = 10)
-{
-	std::string str(1, '\0');
-	bool done = false;
-	while(!done)
-	{
-		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, base);
-		if(result.ec != std::errc{})
-		{
-			str.resize(Util::ExponentialGrow(str.size()), '\0');
-		} else
-		{
-			str.resize(result.ptr - str.data());
-			done = true;
-		}
-	}
-	return str;
-}
-
-template<typename T>
-static inline std::string ToStringHelperInt(const T & x)
-{
-	return ToCharsInt(x);
-}
-
 #if MPT_WSTRING_FORMAT
-template<typename T>
-static inline std::wstring ToWStringHelperInt(const T & x)
-{
-	return ToWideSimple(ToCharsInt(x));
-}
-#endif
-
-#if MPT_FORMAT_CXX17_FLOAT
-
-template<typename T>
-static inline std::string ToCharsFloat(const T & x)
-{
-	std::string str(1, '\0');
-	bool done = false;
-	while(!done)
-	{
-		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x);
-		if(result.ec != std::errc{})
-		{
-			str.resize(Util::ExponentialGrow(str.size()), '\0');
-		} else
-		{
-			str.resize(result.ptr - str.data());
-			done = true;
-		}
-	}
-	return str;
-}
-
-template<typename T>
-static inline std::string ToCharsFloat(const T & x, std::chars_format fmt)
-{
-	std::string str(1, '\0');
-	bool done = false;
-	while(!done)
-	{
-		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, fmt);
-		if(result.ec != std::errc{})
-		{
-			str.resize(Util::ExponentialGrow(str.size()), '\0');
-		} else
-		{
-			str.resize(result.ptr - str.data());
-			done = true;
-		}
-	}
-	return str;
-}
-
-template<typename T>
-static inline std::string ToCharsFloat(const T & x, std::chars_format fmt, int precision)
-{
-	std::string str(1, '\0');
-	bool done = false;
-	while(!done)
-	{
-		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, fmt, precision);
-		if(result.ec != std::errc{})
-		{
-			str.resize(Util::ExponentialGrow(str.size()), '\0');
-		} else
-		{
-			str.resize(result.ptr - str.data());
-			done = true;
-		}
-	}
-	return str;
-}
-
-template<typename T>
-static inline std::string ToStringHelperFloat(const T & x)
-{
-	return ToCharsFloat(x);
-}
-
-#if MPT_WSTRING_FORMAT
-template<typename T>
-static inline std::wstring ToWStringHelperFloat(const T & x)
-{
-	return ToWideSimple(ToCharsFloat(x));
-}
-#endif
-
-#else // !MPT_FORMAT_CXX17_FLOAT
-
-template<typename T>
-static inline std::string ToStringHelperFloat(const T & x)
-{
-	std::ostringstream o;
-	o.imbue(std::locale::classic());
-	o << std::setprecision(std::numeric_limits<T>::max_digits10) << x;
-	return o.str();
-}
-
-#if MPT_WSTRING_FORMAT
-template<typename T>
-static inline std::wstring ToWStringHelperFloat(const T & x)
-{
-	std::wostringstream o;
-	o.imbue(std::locale::classic());
-	o << std::setprecision(std::numeric_limits<T>::max_digits10) << x;
-	return o.str();
-}
-#endif
-
-#endif // MPT_FORMAT_CXX17_FLOAT
-
-std::string ToString(const bool & x) { return ToStringHelperInt(static_cast<int>(x)); }
-std::string ToString(const signed char & x) { return ToStringHelperInt(x); }
-std::string ToString(const unsigned char & x) { return ToStringHelperInt(x); }
-std::string ToString(const signed short & x) { return ToStringHelperInt(x); }
-std::string ToString(const unsigned short & x) { return ToStringHelperInt(x); }
-std::string ToString(const signed int & x) { return ToStringHelperInt(x); }
-std::string ToString(const unsigned int & x) { return ToStringHelperInt(x); }
-std::string ToString(const signed long & x) { return ToStringHelperInt(x); }
-std::string ToString(const unsigned long & x) { return ToStringHelperInt(x); }
-std::string ToString(const signed long long & x) { return ToStringHelperInt(x); }
-std::string ToString(const unsigned long long & x) { return ToStringHelperInt(x); }
-std::string ToString(const float & x) { return ToStringHelperFloat(x); }
-std::string ToString(const double & x) { return ToStringHelperFloat(x); }
-std::string ToString(const long double & x) { return ToStringHelperFloat(x); }
-
-#if MPT_WSTRING_FORMAT
 #if MPT_USTRING_MODE_UTF8
 mpt::ustring ToUString(const std::wstring & x) { return mpt::ToUnicode(x); }
 #endif
@@ -207,36 +50,36 @@
 mpt::ustring ToUString(const CString & x)  { return mpt::ToUnicode(x); }
 #endif // MPT_WITH_MFC
 #if MPT_USTRING_MODE_WIDE
-mpt::ustring ToUString(const bool & x) { return ToWStringHelperInt(static_cast<int>(x)); }
-mpt::ustring ToUString(const signed char & x) { return ToWStringHelperInt(x); }
-mpt::ustring ToUString(const unsigned char & x) { return ToWStringHelperInt(x); }
-mpt::ustring ToUString(const signed short & x) { return ToWStringHelperInt(x); }
-mpt::ustring ToUString(const unsigned short & x) { return ToWStringHelperInt(x); }
-mpt::ustring ToUString(const signed int & x) { return ToWStringHelperInt(x); }
-mpt::ustring ToUString(const unsigned int & x) { return ToWStringHelperInt(x); }
-mpt::ustring ToUString(const signed long & x) { return ToWStringHelperInt(x); }
-mpt::ustring ToUString(const unsigned long & x) { return ToWStringHelperInt(x); }
-mpt::ustring ToUString(const signed long long & x) { return ToWStringHelperInt(x); }
-mpt::ustring ToUString(const unsigned long long & x) { return ToWStringHelperInt(x); }
-mpt::ustring ToUString(const float & x) { return ToWStringHelperFloat(x); }
-mpt::ustring ToUString(const double & x) { return ToWStringHelperFloat(x); }
-mpt::ustring ToUString(const long double & x) { return ToWStringHelperFloat(x); }
+mpt::ustring ToUString(const bool & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const signed char & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const unsigned char & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const signed short & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const unsigned short & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const signed int & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const unsigned int & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const signed long & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const unsigned long & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const signed long long & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const unsigned long long & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const float & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const double & x) { return mpt::format_value_default<std::wstring>(x); }
+mpt::ustring ToUString(const long double & x) { return mpt::format_value_default<std::wstring>(x); }
 #endif
 #if MPT_USTRING_MODE_UTF8
-mpt::ustring ToUString(const bool & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(static_cast<int>(x))); }
-mpt::ustring ToUString(const signed char & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(x)); }
-mpt::ustring ToUString(const unsigned char & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(x)); }
-mpt::ustring ToUString(const signed short & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(x)); }
-mpt::ustring ToUString(const unsigned short & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(x)); }
-mpt::ustring ToUString(const signed int & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(x)); }
-mpt::ustring ToUString(const unsigned int & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(x)); }
-mpt::ustring ToUString(const signed long & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(x)); }
-mpt::ustring ToUString(const unsigned long & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(x)); }
-mpt::ustring ToUString(const signed long long & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(x)); }
-mpt::ustring ToUString(const unsigned long long & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperInt(x)); }
-mpt::ustring ToUString(const float & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperFloat(x)); }
-mpt::ustring ToUString(const double & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperFloat(x)); }
-mpt::ustring ToUString(const long double & x) { return mpt::ToUnicode(mpt::Charset::UTF8, ToStringHelperFloat(x)); }
+mpt::ustring ToUString(const bool & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const signed char & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const unsigned char & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const signed short & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const unsigned short & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const signed int & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const unsigned int & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const signed long & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const unsigned long & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const signed long long & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const unsigned long long & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const float & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const double & x) { return mpt::format_value_default<mpt::ustring>(x); }
+mpt::ustring ToUString(const long double & x) { return mpt::format_value_default<mpt::ustring>(x); }
 #endif
 
 #if MPT_WSTRING_FORMAT
@@ -246,386 +89,87 @@
 #if defined(MPT_WITH_MFC)
 std::wstring ToWString(const CString & x) { return mpt::ToWide(x); }
 #endif // MPT_WITH_MFC
-std::wstring ToWString(const bool & x) { return ToWStringHelperInt(static_cast<int>(x)); }
-std::wstring ToWString(const signed char & x) { return ToWStringHelperInt(x); }
-std::wstring ToWString(const unsigned char & x) { return ToWStringHelperInt(x); }
-std::wstring ToWString(const signed short & x) { return ToWStringHelperInt(x); }
-std::wstring ToWString(const unsigned short & x) { return ToWStringHelperInt(x); }
-std::wstring ToWString(const signed int & x) { return ToWStringHelperInt(x); }
-std::wstring ToWString(const unsigned int & x) { return ToWStringHelperInt(x); }
-std::wstring ToWString(const signed long & x) { return ToWStringHelperInt(x); }
-std::wstring ToWString(const unsigned long & x) { return ToWStringHelperInt(x); }
-std::wstring ToWString(const signed long long & x) { return ToWStringHelperInt(x); }
-std::wstring ToWString(const unsigned long long & x) { return ToWStringHelperInt(x); }
-std::wstring ToWString(const float & x) { return ToWStringHelperFloat(x); }
-std::wstring ToWString(const double & x) { return ToWStringHelperFloat(x); }
-std::wstring ToWString(const long double & x) { return ToWStringHelperFloat(x); }
+std::wstring ToWString(const bool & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const signed char & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const unsigned char & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const signed short & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const unsigned short & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const signed int & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const unsigned int & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const signed long & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const unsigned long & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const signed long long & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const unsigned long long & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const float & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const double & x) { return mpt::format_value_default<std::wstring>(x); }
+std::wstring ToWString(const long double & x) { return mpt::format_value_default<std::wstring>(x); }
 #endif
 
 
-template <typename Tchar>
-struct NumPunct : std::numpunct<Tchar>
-{
-private:
-	unsigned int group;
-	char sep;
-public:
-	NumPunct(unsigned int g, char s)
-		: group(g)
-		, sep(s)
-	{}
-	std::string do_grouping() const override
-	{
-		return std::string(1, static_cast<char>(group));
-	}
-	Tchar do_thousands_sep() const override
-	{
-		return static_cast<Tchar>(sep);
-	}
-};
 
-template<typename Tostream, typename T>
-static inline void ApplyFormat(Tostream & o, const FormatSpec & format, const T &)
-{
-	if constexpr(!std::numeric_limits<T>::is_integer)
-	{
-		if(format.GetGroup() > 0)
-		{
-			o.imbue(std::locale(o.getloc(), new NumPunct<typename Tostream::char_type>(format.GetGroup(), format.GetGroupSep())));
-		}
-	}
-	FormatFlags f = format.GetFlags();
-	std::size_t width = format.GetWidth();
-	int precision = format.GetPrecision();
-	if(precision != -1 && width != 0 && !(f & fmt_base::NotaFix) && !(f & fmt_base::NotaSci))
-	{
-		// fixup:
-		// precision behaves differently from .#
-		// avoid default format when precision and width are set
-		f &= ~fmt_base::NotaNrm;
-		f |= fmt_base::NotaFix;
-	}
-	if(f & fmt_base::BaseDec) { o << std::dec; }
-	else if(f & fmt_base::BaseHex) { o << std::hex; }
-	if(f & fmt_base::NotaNrm ) { /*nothing*/ }
-	else if(f & fmt_base::NotaFix ) { o << std::setiosflags(std::ios::fixed); }
-	else if(f & fmt_base::NotaSci ) { o << std::setiosflags(std::ios::scientific); }
-	if(f & fmt_base::CaseLow) { o << std::nouppercase; }
-	else if(f & fmt_base::CaseUpp) { o << std::uppercase; }
-	if constexpr(!std::numeric_limits<T>::is_integer)
-	{
-		if(f & fmt_base::FillOff) { /* nothing */ }
-		else if(f & fmt_base::FillNul) { o << std::setw(width) << std::setfill(typename Tostream::char_type('0')); }
-	}
-	if(precision != -1)
-	{
-		o << std::setprecision(precision);
-	} else
-	{
-		if constexpr(std::is_floating_point<T>::value)
-		{
-			if(f & fmt_base::NotaNrm)
-			{
-				o << std::setprecision(std::numeric_limits<T>::max_digits10);
-			} else if(f & fmt_base::NotaFix)
-			{
-				o << std::setprecision(std::numeric_limits<T>::digits10);
-			} else if(f & fmt_base::NotaSci)
-			{
-				o << std::setprecision(std::numeric_limits<T>::max_digits10 - 1);
-			} else
-			{
-				o << std::setprecision(std::numeric_limits<T>::max_digits10);
-			}
-		}
-	}
-}
+std::string FormatVal(const bool & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const signed char & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const unsigned char & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const signed short & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const unsigned short & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const signed int & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const unsigned int & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const signed long & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const unsigned long & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const signed long long & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const unsigned long long & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const float & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const double & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
+std::string FormatVal(const long double & x, const FormatSpec & f) { return mpt::format_simple<std::string>(x, f); }
 
-template<typename Tstring>
-static inline Tstring PostProcessCase(Tstring str, const FormatSpec & format)
-{
-	FormatFlags f = format.GetFlags();
-	if(f & fmt_base::CaseUpp)
-	{
-		for(auto & c : str)
-		{
-			if('a' <= c && c <= 'z')
-			{
-				c -= 'a' - 'A';
-			}
-		}
-	}
-	return str;
-}
-
-template<typename Tstring>
-static inline Tstring PostProcessDigits(Tstring str, const FormatSpec & format)
-{
-	FormatFlags f = format.GetFlags();
-	std::size_t width = format.GetWidth();
-	if(f & fmt_base::FillNul)
-	{
-		auto pos = str.begin();
-		if(str.length() > 0)
-		{
-			if(str[0] == typename Tstring::value_type('+'))
-			{
-				pos++;
-				width++;
-			} else if(str[0] == typename Tstring::value_type('-'))
-			{
-				pos++;
-				width++;
-			}
-		}
-		if(str.length() < width)
-		{
-			str.insert(pos, width - str.length(), '0');
-		}
-	}
-	return str;
-}
-
-#if MPT_FORMAT_CXX17_FLOAT
-
-template<typename Tstring>
-static inline Tstring PostProcessFloatWidth(Tstring str, const FormatSpec & format)
-{
-	FormatFlags f = format.GetFlags();
-	std::size_t width = format.GetWidth();
-	if(f & fmt_base::FillNul)
-	{
-		auto pos = str.begin();
-		if(str.length() > 0)
-		{
-			if(str[0] == typename Tstring::value_type('+'))
-			{
-				pos++;
-				width++;
-			} else if(str[0] == typename Tstring::value_type('-'))
-			{
-				pos++;
-				width++;
-			}
-		}
-		if(str.length() - std::distance(str.begin(), pos) < width)
-		{
-			str.insert(pos, width - str.length() - std::distance(str.begin(), pos), '0');
-		}
-	} else
-	{
-		if(str.length() < width)
-		{
-			str.insert(0, width - str.length(), ' ');
-		}
-	}
-	return str;
-}
-
-#endif // MPT_FORMAT_CXX17_FLOAT
-
-#if MPT_COMPILER_MSVC
-#pragma warning(push)
-#pragma warning(disable:4723) // potential divide by 0
-#endif // MPT_COMPILER_MSVC
-template<typename Tstring>
-static inline Tstring PostProcessGroup(Tstring str, const FormatSpec & format)
-{
-	if(format.GetGroup() > 0)
-	{
-		const unsigned int groupSize = format.GetGroup();
-		const char groupSep = format.GetGroupSep();
-		std::size_t len = str.length();
-		for(std::size_t n = 0; n < len; ++n)
-		{
-			if(n > 0 && (n % groupSize) == 0)
-			{
-				if(!(n == (len - 1) && (str[0] == typename Tstring::value_type('+') || str[0] == typename Tstring::value_type('-'))))
-				{
-					str.insert(str.begin() + (len - n), 1, groupSep);
-				}
-			}
-		}
-	}
-	return str;
-}
-#if MPT_COMPILER_MSVC
-#pragma warning(pop)
-#endif // MPT_COMPILER_MSVC
-
-template<typename T>
-static inline std::string FormatValHelperInt(const T & x, const FormatSpec & f)
-{
-	int base = 10;
-	if(f.GetFlags() & fmt_base::BaseDec) { base = 10; }
-	if(f.GetFlags() & fmt_base::BaseHex) { base = 16; }
-	return PostProcessGroup(PostProcessDigits(PostProcessCase(ToCharsInt(x, base), f), f), f);
-}
-
-#if MPT_WSTRING_FORMAT
-template<typename T>
-static inline std::wstring FormatValWHelperInt(const T & x, const FormatSpec & f)
-{
-	int base = 10;
-	if(f.GetFlags() & fmt_base::BaseDec) { base = 10; }
-	if(f.GetFlags() & fmt_base::BaseHex) { base = 16; }
-	return ToWideSimple(PostProcessGroup(PostProcessDigits(PostProcessCase(ToCharsInt(x, base), f), f), f));
-}
-#endif
-
-#if MPT_FORMAT_CXX17_FLOAT
-
-template<typename T>
-static inline std::string FormatValHelperFloat(const T & x, const FormatSpec & f)
-{
-	if(f.GetPrecision() != -1)
-	{
-		if(f.GetFlags() & fmt_base::NotaSci)
-		{
-			return PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::scientific, f.GetPrecision()), f);
-		} else if(f.GetFlags() & fmt_base::NotaFix)
-		{
-			return PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::fixed, f.GetPrecision()), f);
-		} else
-		{
-			return PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::general, f.GetPrecision()), f);
-		}
-	} else
-	{
-		if(f.GetFlags() & fmt_base::NotaSci)
-		{
-			return PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::scientific), f);
-		} else if(f.GetFlags() & fmt_base::NotaFix)
-		{
-			return PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::fixed), f);
-		} else
-		{
-			return PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::general), f);
-		}
-	}
-}
-
-#if MPT_WSTRING_FORMAT
-template<typename T>
-static inline std::wstring FormatValWHelperFloat(const T & x, const FormatSpec & f)
-{
-	if(f.GetPrecision() != -1)
-	{
-		if(f.GetFlags() & fmt_base::NotaSci)
-		{
-			return ToWideSimple(PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::scientific, f.GetPrecision()), f));
-		} else if(f.GetFlags() & fmt_base::NotaFix)
-		{
-			return ToWideSimple(PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::fixed, f.GetPrecision()), f));
-		} else
-		{
-			return ToWideSimple(PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::general, f.GetPrecision()), f));
-		}
-	} else
-	{
-		if(f.GetFlags() & fmt_base::NotaSci)
-		{
-			return ToWideSimple(PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::scientific), f));
-		} else if(f.GetFlags() & fmt_base::NotaFix)
-		{
-			return ToWideSimple(PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::fixed), f));
-		} else
-		{
-			return ToWideSimple(PostProcessFloatWidth(ToCharsFloat(x, std::chars_format::general), f));
-		}
-	}
-}
-#endif
-
-#else // !MPT_FORMAT_CXX17_FLOAT
-
-template<typename T>
-static inline std::string FormatValHelperFloat(const T & x, const FormatSpec & f)
-{
-	std::ostringstream o;
-	o.imbue(std::locale::classic());
-	ApplyFormat(o, f, x);
-	o << x;
-	return o.str();
-}
-
-#if MPT_WSTRING_FORMAT
-template<typename T>
-static inline std::wstring FormatValWHelperFloat(const T & x, const FormatSpec & f)
-{
-	std::wostringstream o;
-	o.imbue(std::locale::classic());
-	ApplyFormat(o, f, x);
-	o << x;
-	return o.str();
-}
-#endif
-
-#endif // MPT_FORMAT_CXX17_FLOAT
-
-std::string FormatVal(const bool & x, const FormatSpec & f) { return FormatValHelperInt(static_cast<int>(x), f); }
-std::string FormatVal(const signed char & x, const FormatSpec & f) { return FormatValHelperInt(x, f); }
-std::string FormatVal(const unsigned char & x, const FormatSpec & f) { return FormatValHelperInt(x, f); }
-std::string FormatVal(const signed short & x, const FormatSpec & f) { return FormatValHelperInt(x, f); }
-std::string FormatVal(const unsigned short & x, const FormatSpec & f) { return FormatValHelperInt(x, f); }
-std::string FormatVal(const signed int & x, const FormatSpec & f) { return FormatValHelperInt(x, f); }
-std::string FormatVal(const unsigned int & x, const FormatSpec & f) { return FormatValHelperInt(x, f); }
-std::string FormatVal(const signed long & x, const FormatSpec & f) { return FormatValHelperInt(x, f); }
-std::string FormatVal(const unsigned long & x, const FormatSpec & f) { return FormatValHelperInt(x, f); }
-std::string FormatVal(const signed long long & x, const FormatSpec & f) { return FormatValHelperInt(x, f); }
-std::string FormatVal(const unsigned long long & x, const FormatSpec & f) { return FormatValHelperInt(x, f); }
-std::string FormatVal(const float & x, const FormatSpec & f) { return FormatValHelperFloat(x, f); }
-std::string FormatVal(const double & x, const FormatSpec & f) { return FormatValHelperFloat(x, f); }
-std::string FormatVal(const long double & x, const FormatSpec & f) { return FormatValHelperFloat(x, f); }
-
 #if MPT_USTRING_MODE_WIDE
-mpt::ustring FormatValU(const bool & x, const FormatSpec & f) { return FormatValWHelperInt(static_cast<int>(x), f); }
-mpt::ustring FormatValU(const signed char & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-mpt::ustring FormatValU(const unsigned char & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-mpt::ustring FormatValU(const signed short & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-mpt::ustring FormatValU(const unsigned short & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-mpt::ustring FormatValU(const signed int & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-mpt::ustring FormatValU(const unsigned int & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-mpt::ustring FormatValU(const signed long & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-mpt::ustring FormatValU(const unsigned long & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-mpt::ustring FormatValU(const signed long long & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-mpt::ustring FormatValU(const unsigned long long & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-mpt::ustring FormatValU(const float & x, const FormatSpec & f) { return FormatValWHelperFloat(x, f); }
-mpt::ustring FormatValU(const double & x, const FormatSpec & f) { return FormatValWHelperFloat(x, f); }
-mpt::ustring FormatValU(const long double & x, const FormatSpec & f) { return FormatValWHelperFloat(x, f); }
+mpt::ustring FormatValU(const bool & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const signed char & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const unsigned char & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const signed short & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const unsigned short & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const signed int & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const unsigned int & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const signed long & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const unsigned long & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const signed long long & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const unsigned long long & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const float & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const double & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+mpt::ustring FormatValU(const long double & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
 #endif
 #if MPT_USTRING_MODE_UTF8
-mpt::ustring FormatValU(const bool & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(static_cast<int>(x), f)); }
-mpt::ustring FormatValU(const signed char & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(x, f)); }
-mpt::ustring FormatValU(const unsigned char & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(x, f)); }
-mpt::ustring FormatValU(const signed short & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(x, f)); }
-mpt::ustring FormatValU(const unsigned short & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(x, f)); }
-mpt::ustring FormatValU(const signed int & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(x, f)); }
-mpt::ustring FormatValU(const unsigned int & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(x, f)); }
-mpt::ustring FormatValU(const signed long & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(x, f)); }
-mpt::ustring FormatValU(const unsigned long & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(x, f)); }
-mpt::ustring FormatValU(const signed long long & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(x, f)); }
-mpt::ustring FormatValU(const unsigned long long & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperInt(x, f)); }
-mpt::ustring FormatValU(const float & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperFloat(x, f)); }
-mpt::ustring FormatValU(const double & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperFloat(x, f)); }
-mpt::ustring FormatValU(const long double & x, const FormatSpec & f) { return mpt::ToUnicode(mpt::Charset::UTF8, FormatValHelperFloat(x, f)); }
+mpt::ustring FormatValU(const bool & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const signed char & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const unsigned char & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const signed short & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const unsigned short & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const signed int & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const unsigned int & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const signed long & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const unsigned long & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const signed long long & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const unsigned long long & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const float & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const double & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
+mpt::ustring FormatValU(const long double & x, const FormatSpec & f) { return mpt::format_simple<mpt::ustring>(x, f); }
 #endif
 
 #if MPT_WSTRING_FORMAT
-std::wstring FormatValW(const bool & x, const FormatSpec & f) { return FormatValWHelperInt(static_cast<int>(x), f); }
-std::wstring FormatValW(const signed char & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-std::wstring FormatValW(const unsigned char & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-std::wstring FormatValW(const signed short & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-std::wstring FormatValW(const unsigned short & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-std::wstring FormatValW(const signed int & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-std::wstring FormatValW(const unsigned int & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-std::wstring FormatValW(const signed long & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-std::wstring FormatValW(const unsigned long & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-std::wstring FormatValW(const signed long long & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-std::wstring FormatValW(const unsigned long long & x, const FormatSpec & f) { return FormatValWHelperInt(x, f); }
-std::wstring FormatValW(const float & x, const FormatSpec & f) { return FormatValWHelperFloat(x, f); }
-std::wstring FormatValW(const double & x, const FormatSpec & f) { return FormatValWHelperFloat(x, f); }
-std::wstring FormatValW(const long double & x, const FormatSpec & f) { return FormatValWHelperFloat(x, f); }
+std::wstring FormatValW(const bool & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const signed char & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const unsigned char & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const signed short & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const unsigned short & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const signed int & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const unsigned int & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const signed long & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const unsigned long & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const signed long long & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const unsigned long long & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const float & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const double & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
+std::wstring FormatValW(const long double & x, const FormatSpec & f) { return mpt::format_simple<std::wstring>(x, f); }
 #endif
 
 
Index: common/mptStringFormat.h
===================================================================
--- common/mptStringFormat.h	(revision 14628)
+++ common/mptStringFormat.h	(working copy)
@@ -12,6 +12,11 @@
 
 #include "BuildSettings.h"
 
+#include "mpt/base/pointer.hpp"
+#include "mpt/string/format_message.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+#include "mpt/string/types.hpp"
+
 #include <stdexcept>
 
 #include "mptString.h"
@@ -33,15 +38,12 @@
 //     which results in "C" ASCII locale behavior.
 //  2. The full suite of printf-like or iostream like number formatting is generally not required. Instead, a sane subset functionality
 //     is provided here.
-//     For convenience, mpt::fmt::f(const char *, float) allows formatting a single floating point value with a
-//     standard printf-like format string. This itself relies on iostream with classic() locale internally and is thus current locale
-//     agnostic.
 //     When formatting integers, it is recommended to use mpt::fmt::dec or mpt::fmt::hex. Appending a template argument '<n>' sets the width,
 //     the same way as '%nd' would do. Appending a '0' to the function name causes zero-filling as print-like '%0nd' would do. Spelling 'HEX'
 //     in upper-case generates upper-case hex digits. If these are not known at compile-time, a more verbose FormatVal(int, format) can be
 //     used.
 //  3. mpt::format(format)(...) provides simplified and type-safe message and localization string formatting.
-//     The only specifier allowed is '%' followed by a single digit n. It references to n-th parameter after the format string (1-based).
+//     The only specifier allowed is '{}' enclosing a number n. It references to n-th parameter after the format string (1-based).
 //     This mimics the behaviour of QString::arg() in QT4/5 or MFC AfxFormatString2(). C printf-like functions offer similar functionality
 //     with a '%n$TYPE' syntax. In .NET, the syntax is '{n}'. This is useful to support localization strings that can change the parameter
 //     ordering.
@@ -200,33 +202,24 @@
 template<typename Tstring, typename T> inline Tstring ToStringT(const T & x) { return ToStringTFunctor<Tstring>()(x); }
 
 
+struct ToStringFormatter {
+	template <typename Tstring, typename T>
+	static inline Tstring format(const T& value) {
+		return ToStringTFunctor<Tstring>()(value);
 
-struct fmt_base
-{
-
-enum FormatFlagsEnum
-{
-	BaseDec = 0x0001, // base 10 (integers only)
-	BaseHex = 0x0002, // base 16 (integers only)
-	CaseLow = 0x0010, // lower case hex digits
-	CaseUpp = 0x0020, // upper case hex digits
-	FillOff = 0x0100, // do not fill up width
-	FillNul = 0x0400, // fill up width with zeros
-	NotaNrm = 0x1000, // float: normal/default notation
-	NotaFix = 0x2000, // float: fixed point notation
-	NotaSci = 0x4000, // float: scientific notation
+	}
 };
 
-}; // struct fmt_base
 
-typedef unsigned int FormatFlags;
+using FormatSpec = mpt::format_simple_spec;
 
-static_assert(sizeof(FormatFlags) >= sizeof(fmt_base::FormatFlagsEnum));
+using FormatFlags = mpt::format_simple_flags;
 
-class FormatSpec;
+using fmt_base = mpt::format_simple_base;
 
+
 std::string FormatVal(const char & x, const FormatSpec & f) = delete; // deprecated to catch potential API mis-use, use std::string(1, x) instead
-#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#if !MPT_COMPILER_QUIRK_NO_WCHAR
 std::string FormatVal(const wchar_t & x, const FormatSpec & f) = delete; // deprecated to catch potential API mis-use, use std::wstring(1, x) instead
 #endif // !MPT_COMPILER_QUIRK_NO_WCHAR
 std::string FormatVal(const bool & x, const FormatSpec & f);
@@ -245,7 +238,7 @@
 std::string FormatVal(const long double & x, const FormatSpec & f);
 
 mpt::ustring FormatValU(const char & x, const FormatSpec & f) = delete; // deprecated to catch potential API mis-use, use std::string(1, x) instead
-#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#if !MPT_COMPILER_QUIRK_NO_WCHAR
 mpt::ustring FormatValU(const wchar_t & x, const FormatSpec & f) = delete; // deprecated to catch potential API mis-use, use std::wstring(1, x) instead
 #endif // !MPT_COMPILER_QUIRK_NO_WCHAR
 mpt::ustring FormatValU(const bool & x, const FormatSpec & f);
@@ -265,7 +258,7 @@
 
 #if MPT_WSTRING_FORMAT
 std::wstring FormatValW(const char & x, const FormatSpec & f) = delete; // deprecated to catch potential API mis-use, use std::string(1, x) instead
-#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#if !MPT_COMPILER_QUIRK_NO_WCHAR
 std::wstring FormatValW(const wchar_t & x, const FormatSpec & f) = delete; // deprecated to catch potential API mis-use, use std::wstring(1, x) instead
 #endif // !MPT_COMPILER_QUIRK_NO_WCHAR
 std::wstring FormatValW(const bool & x, const FormatSpec & f);
@@ -302,86 +295,6 @@
 #endif // MPT_WITH_MFC
 
 
-class FormatSpec
-{
-private:
-	FormatFlags flags;
-	std::size_t width;
-	int precision;
-	unsigned int group;
-	char group_sep;
-public:
-	MPT_CONSTEXPRINLINE FormatSpec() noexcept : flags(0), width(0), precision(-1), group(0), group_sep(',') {}
-	MPT_CONSTEXPRINLINE FormatFlags GetFlags() const noexcept { return flags; }
-	MPT_CONSTEXPRINLINE std::size_t GetWidth() const noexcept { return width; }
-	MPT_CONSTEXPRINLINE int GetPrecision() const noexcept { return precision; }
-	MPT_CONSTEXPRINLINE unsigned int GetGroup() const noexcept { return group; }
-	MPT_CONSTEXPRINLINE char GetGroupSep() const noexcept { return group_sep; }
-	MPT_CONSTEXPRINLINE FormatSpec & SetFlags(FormatFlags f) noexcept { flags = f; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & SetWidth(std::size_t w) noexcept { width = w; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & SetPrecision(int p) noexcept { precision = p; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & SetGroup(unsigned int g) noexcept { group = g; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & SetGroupSep(char s) noexcept { group_sep = s; return *this; }
-public:
-	MPT_CONSTEXPRINLINE FormatSpec & BaseDec() noexcept { flags &= ~(fmt_base::BaseDec|fmt_base::BaseHex); flags |= fmt_base::BaseDec; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & BaseHex() noexcept { flags &= ~(fmt_base::BaseDec|fmt_base::BaseHex); flags |= fmt_base::BaseHex; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & CaseLow() noexcept { flags &= ~(fmt_base::CaseLow|fmt_base::CaseUpp); flags |= fmt_base::CaseLow; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & CaseUpp() noexcept { flags &= ~(fmt_base::CaseLow|fmt_base::CaseUpp); flags |= fmt_base::CaseUpp; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & FillOff() noexcept { flags &= ~(fmt_base::FillOff|fmt_base::FillNul); flags |= fmt_base::FillOff; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & FillNul() noexcept { flags &= ~(fmt_base::FillOff|fmt_base::FillNul); flags |= fmt_base::FillNul; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & NotaNrm() noexcept { flags &= ~(fmt_base::NotaNrm|fmt_base::NotaFix|fmt_base::NotaSci); flags |= fmt_base::NotaNrm; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & NotaFix() noexcept { flags &= ~(fmt_base::NotaNrm|fmt_base::NotaFix|fmt_base::NotaSci); flags |= fmt_base::NotaFix; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & NotaSci() noexcept { flags &= ~(fmt_base::NotaNrm|fmt_base::NotaFix|fmt_base::NotaSci); flags |= fmt_base::NotaSci; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & Width(std::size_t w) noexcept { width = w; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & Prec(int p) noexcept { precision = p; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & Group(unsigned int g) noexcept { group = g; return *this; }
-	MPT_CONSTEXPRINLINE FormatSpec & GroupSep(char s) noexcept { group_sep = s; return *this; }
-public:
-	MPT_CONSTEXPRINLINE FormatSpec & Dec() noexcept { return BaseDec(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Hex() noexcept { return BaseHex(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Low() noexcept { return CaseLow(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Upp() noexcept { return CaseUpp(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Off() noexcept { return FillOff(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Nul() noexcept { return FillNul(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Nrm() noexcept { return NotaNrm(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Fix() noexcept { return NotaFix(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Sci() noexcept { return NotaSci(); }
-public:
-	MPT_CONSTEXPRINLINE FormatSpec & Decimal() noexcept { return BaseDec(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Hexadecimal() noexcept { return BaseHex(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Lower() noexcept { return CaseLow(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Upper() noexcept { return CaseUpp(); }
-	MPT_CONSTEXPRINLINE FormatSpec & FillNone() noexcept { return FillOff(); }
-	MPT_CONSTEXPRINLINE FormatSpec & FillZero() noexcept { return FillNul(); }
-	MPT_CONSTEXPRINLINE FormatSpec & FloatNormal() noexcept { return NotaNrm(); }
-	MPT_CONSTEXPRINLINE FormatSpec & FloatFixed() noexcept { return NotaFix(); }
-	MPT_CONSTEXPRINLINE FormatSpec & FloatScientific() noexcept { return NotaSci(); }
-	MPT_CONSTEXPRINLINE FormatSpec & Precision(int p) noexcept { return Prec(p); }
-};
-
-template <typename Tdst, typename Tsrc>
-struct pointer_cast_helper
-{
-	Tdst operator()(const Tsrc & src) const { return src; }
-};
-template <typename Tdst, typename Tptr>
-struct pointer_cast_helper<Tdst, const Tptr*>
-{
-	Tdst operator()(const Tptr * const & src) const { return reinterpret_cast<const Tdst>(src); }
-};
-template <typename Tdst, typename Tptr>
-struct pointer_cast_helper<Tdst, Tptr*>
-{
-	Tdst operator()(const Tptr * const & src) const { return reinterpret_cast<const Tdst>(src); }
-};
-
-
-template <typename Tdst, typename Tsrc>
-Tdst pointer_cast(const Tsrc & src)
-{
-	return pointer_cast_helper<Tdst, Tsrc>()(src);
-}
-
 template <typename Tstring>
 struct fmtT : fmt_base
 {
@@ -497,13 +410,13 @@
 static inline Tstring ptr(const T& x)
 {
 	static_assert(std::is_pointer<T>::value || std::is_same<T, std::uintptr_t>::value || std::is_same<T, std::intptr_t>::value, "");
-	return hex0<mpt::pointer_size * 2>(pointer_cast<const std::uintptr_t>(x));
+	return hex0<mpt::pointer_size * 2>(mpt::pointer_cast<const std::uintptr_t>(x));
 }
 template<typename T>
 static inline Tstring PTR(const T& x)
 {
 	static_assert(std::is_pointer<T>::value || std::is_same<T, std::uintptr_t>::value || std::is_same<T, std::intptr_t>::value, "");
-	return HEX0<mpt::pointer_size * 2>(pointer_cast<const std::uintptr_t>(x));
+	return HEX0<mpt::pointer_size * 2>(mpt::pointer_cast<const std::uintptr_t>(x));
 }
 
 static inline Tstring pad_left(std::size_t width_, const Tstring &str)
@@ -559,428 +472,28 @@
 typedef fmtT<CString> cfmt;
 #endif // MPT_WITH_MFC
 
-} // namespace mpt
 
-namespace mpt {
+#define MPT_FORMAT(f) mpt::format_message<mpt::ToStringFormatter, mpt::parse_format_string_argument_count(f)>(f)
 
-namespace String {
-
-namespace detail
-{
-
-template <typename T> struct to_string_type { };
-template <> struct to_string_type<std::string    > { typedef std::string  type; };
-template <> struct to_string_type<char           > { typedef std::string  type; };
-template <> struct to_string_type<char *         > { typedef std::string  type; };
-template <> struct to_string_type<const char     > { typedef std::string  type; };
-template <> struct to_string_type<const char *   > { typedef std::string  type; };
-#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
-template <> struct to_string_type<std::wstring   > { typedef std::wstring type; };
-template <> struct to_string_type<wchar_t        > { typedef std::wstring type; };
-template <> struct to_string_type<wchar_t *      > { typedef std::wstring type; };
-template <> struct to_string_type<const wchar_t  > { typedef std::wstring type; };
-template <> struct to_string_type<const wchar_t *> { typedef std::wstring type; };
-#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
-#if MPT_USTRING_MODE_UTF8
-template <> struct to_string_type<mpt::ustring   > { typedef mpt::ustring type; };
-#endif
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-template <> struct to_string_type<mpt::lstring   > { typedef mpt::lstring type; };
-#endif // MPT_ENABLE_CHARSET_LOCALE
-#if defined(MPT_WITH_MFC)
-template <> struct to_string_type<CString        > { typedef CString      type; };
-#endif // MPT_WITH_MFC
-template <typename T, std::size_t N> struct to_string_type<T [N]> { typedef typename to_string_type<T>::type type; };
-
-} // namespace detail
-
-} // namespace String
-
-class format_string_syntax_error
-	: public std::domain_error
-{
-public:
-	format_string_syntax_error()
-		: std::domain_error("format string syntax error")
-	{
-		return;
-	}
-};
-
-template<typename Tformat>
-class message_formatter
-{
-
-public:
-
-	typedef typename mpt::String::detail::to_string_type<Tformat>::type Tstring;
-
-private:
-
-	Tstring format;
-
-private:
-
-	MPT_NOINLINE Tstring do_format(const mpt::span<const Tstring> vals) const
-	{
-		using traits = typename mpt::string_traits<Tstring>;
-		using char_type = typename traits::char_type;
-		using size_type = typename traits::size_type;
-		Tstring result;
-		const size_type len = traits::length(format);
-		traits::reserve(result, len);
-		std::size_t max_arg = 0;
-		std::size_t args = 0;
-		bool std_style_success = true; 
-		{
-			enum class state : int {
-				error = -1,
-				text = 0,
-				open_seen = 1,
-				number_seen = 2,
-				close_seen = 3,
-			};
-			state state = state::text;
-			bool numbered_args = false;
-			bool unnumbered_args = false;
-			std::size_t last_arg = 0;
-			std::size_t this_arg = 0;
-			std::size_t current_arg = 0;
-			for(size_type pos = 0; pos != len; ++pos)
-			{
-				char_type c = format[pos];
-				switch(state)
-				{
-				case state::text:
-					if(c == char_type('{'))
-					{
-						state = state::open_seen;
-					} else if(c == char_type('}'))
-					{
-						state = state::close_seen;
-					} else
-					{
-						state = state::text;
-						traits::append(result, 1, c);  // output c here
-					}
-					break;
-				case state::open_seen:
-					if(c == char_type('{'))
-					{
-						state = state::text;
-						traits::append(result, 1, char_type('{'));  // output { here
-					} else if(c == char_type('}'))
-					{
-						state = state::text;
-						unnumbered_args = true;
-						last_arg++;
-						this_arg = last_arg;
-						{ // output this_arg here
-							const std::size_t n = this_arg - 1;
-							if(n < std::size(vals))
-							{
-								traits::append(result, vals[n]);
-							}
-						}
-						if(this_arg > max_arg)
-						{
-							max_arg = this_arg;
-						}
-						args += 1;
-					} else if(char_type('0') <= c && c <= char_type('9'))
-					{
-						state = state::number_seen;
-						numbered_args = true;
-						current_arg = c - char_type('0');
-					} else
-					{
-						state = state::error;
-					}
-					break;
-				case state::number_seen:
-					if(c == char_type('{'))
-					{
-						state = state::error;
-					} else if(c == char_type('}'))
-					{
-						state = state::text;
-						this_arg = current_arg + 1;
-						{ // output this_arg here
-							const std::size_t n = this_arg - 1;
-							if(n < std::size(vals))
-							{
-								traits::append(result, vals[n]);
-							}
-						}
-						if(this_arg > max_arg)
-						{
-							max_arg = this_arg;
-						}
-						args += 1;
-					} else if(char_type('0') <= c && c <= char_type('9'))
-					{
-						state = state::number_seen;
-						numbered_args = true;
-						current_arg = (current_arg * 10) + (c - char_type('0'));
-					} else
-					{
-						state = state::error;
-					}
-					break;
-				case state::close_seen:
-					if(c == char_type('{'))
-					{
-						state = state::error;
-					} else if(c == char_type('}'))
-					{
-						state = state::text;
-						traits::append(result, 1, char_type('}'));  // output } here
-					} else
-					{
-						state = state::error;
-					}
-					break;
-				case state::error:
-					state = state::error;
-					break;
-				}
-			}
-			if(state == state::error)
-			{
-				std_style_success = false;
-			}
-			if(state != state::text)
-			{
-				std_style_success = false;
-			}
-			if(numbered_args && unnumbered_args)
-			{
-				std_style_success = false;
-			}
-		}
-		if(!std_style_success)
-		{
-			throw format_string_syntax_error();
-		}
-		return result;
-	}
-
-public:
-
-	MPT_FORCEINLINE message_formatter(Tstring format_)
-		: format(std::move(format_))
-	{
-	}
-
-public:
-
-	template<typename ...Ts>
-	MPT_NOINLINE Tstring operator() (Ts&&... xs) const
-	{
-		const std::array<Tstring, sizeof...(xs)> vals{{ToStringTFunctor<Tstring>()(std::forward<Ts>(xs))...}};
-		return do_format(mpt::as_span(vals));
-	}
-
-}; // struct message_formatter<Tformat>
-
-template <std::ptrdiff_t N, typename Tchar, typename Tstring>
-class message_formatter_counted
-{
-
-private:
-
-	message_formatter<Tstring>formatter;
-
-public:
-
-	template <std::size_t literal_length>
-	inline message_formatter_counted(const Tchar (&format)[literal_length])
-		: formatter(Tstring(format))
-	{
-		return;
-	}
-
-public:
-
-	template<typename ...Ts>
-	inline Tstring operator() (Ts&&... xs) const
-	{
-		static_assert(static_cast<std::ptrdiff_t>(sizeof...(xs)) == N);
-		return formatter(std::forward<Ts>(xs)...);
-	}
-
-}; // struct message_formatter_counted<Tformat>
-
-template <typename Tchar>
-MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count_impl(const Tchar * const format, const std::size_t len)
-{
-	std::size_t max_arg = 0;
-	std::size_t args = 0;
-	bool std_style_success = true; 
-	{
-		enum class state : int {
-			error = -1,
-			text = 0,
-			open_seen = 1,
-			number_seen = 2,
-			close_seen = 3,
-		};
-		state state = state::text;
-		bool numbered_args = false;
-		bool unnumbered_args = false;
-		std::size_t last_arg = 0;
-		std::size_t this_arg = 0;
-		std::size_t current_arg = 0;
-		for(std::size_t pos = 0; pos != len; ++pos)
-		{
-			Tchar c = format[pos];
-			switch(state)
-			{
-			case state::text:
-				if(c == Tchar('{'))
-				{
-					state = state::open_seen;
-				} else if(c == Tchar('}'))
-				{
-					state = state::close_seen;
-				} else
-				{
-					state = state::text;
-					// output c here
-				}
-				break;
-			case state::open_seen:
-				if(c == Tchar('{'))
-				{
-					state = state::text;
-					// output { here
-				} else if(c == Tchar('}'))
-				{
-					state = state::text;
-					unnumbered_args = true;
-					last_arg++;
-					this_arg = last_arg;
-					// output this_arg here
-					if(this_arg > max_arg)
-					{
-						max_arg = this_arg;
-					}
-					args += 1;
-				} else if(Tchar('0') <= c && c <= Tchar('9'))
-				{
-					state = state::number_seen;
-					numbered_args = true;
-					current_arg = c - Tchar('0');
-				} else
-				{
-					state = state::error;
-				}
-				break;
-			case state::number_seen:
-				if(c == Tchar('{'))
-				{
-					state = state::error;
-				} else if(c == Tchar('}'))
-				{
-					state = state::text;
-					this_arg = current_arg + 1;
-					// output this_arg here
-					if(this_arg > max_arg)
-					{
-						max_arg = this_arg;
-					}
-					args += 1;
-				} else if(Tchar('0') <= c && c <= Tchar('9'))
-				{
-					state = state::number_seen;
-					numbered_args = true;
-					current_arg = (current_arg * 10) + (c - Tchar('0'));
-				} else
-				{
-					state = state::error;
-				}
-				break;
-			case state::close_seen:
-				if(c == Tchar('{'))
-				{
-					state = state::error;
-				} else if(c == Tchar('}'))
-				{
-					state = state::text;
-					// output } here
-				} else
-				{
-					state = state::error;
-				}
-				break;
-			case state::error:
-				state = state::error;
-				break;
-			}
-		}
-		if(state == state::error)
-		{
-			std_style_success = false;
-		}
-		if(state != state::text)
-		{
-			std_style_success = false;
-		}
-		if(numbered_args && unnumbered_args)
-		{
-			std_style_success = false;
-		}
-	}
-	if(!std_style_success)
-	{
-		throw format_string_syntax_error();
-	}
-	if(max_arg != args)
-	{
-		throw format_string_syntax_error();
-	}
-	return max_arg;
-}
-
-template <typename Tchar, std::size_t literal_length>
-MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count(const Tchar (&format)[literal_length])
-{
-	return parse_format_string_argument_count_impl(format, literal_length - 1);
-}
-
-template<std::size_t args, typename Tchar, std::size_t N>
-inline auto format_counted(const Tchar (&format)[N])
-{
-	typedef typename mpt::String::detail::to_string_type<Tchar>::type Tstring;
-	return message_formatter_counted<args, Tchar, Tstring>(format);
-}
-
-template<std::size_t args, typename Tstring, typename Tchar, std::size_t N>
-inline auto format_counted_typed(const Tchar (&format)[N])
-{
-	return message_formatter_counted<args, Tchar, Tstring>(format);
-}
-
-#define MPT_FORMAT(f) mpt::format_counted<mpt::parse_format_string_argument_count(f)>(f)
-
 #if MPT_WSTRING_FORMAT
-#define MPT_WFORMAT(f) mpt::format_counted_typed<mpt::parse_format_string_argument_count( L ## f ), std::wstring>( L ## f )
+#define MPT_WFORMAT(f) mpt::format_message_typed<mpt::ToStringFormatter, mpt::parse_format_string_argument_count( L ## f ), std::wstring>( L ## f )
 #endif
 
-#define MPT_UFORMAT(f) mpt::format_counted_typed<mpt::parse_format_string_argument_count(MPT_ULITERAL(f)), mpt::ustring>(MPT_ULITERAL(f))
+#define MPT_UFORMAT(f) mpt::format_message_typed<mpt::ToStringFormatter, mpt::parse_format_string_argument_count(MPT_ULITERAL(f)), mpt::ustring>(MPT_ULITERAL(f))
 
 #if defined(MPT_ENABLE_CHARSET_LOCALE)
-#define MPT_LFORMAT(f) mpt::format_counted_typed<mpt::parse_format_string_argument_count(f), mpt::lstring>(f)
+#define MPT_LFORMAT(f) mpt::format_message_typed<mpt::ToStringFormatter, mpt::parse_format_string_argument_count(f), mpt::lstring>(f)
 #endif // MPT_ENABLE_CHARSET_LOCALE
 
 #if MPT_OS_WINDOWS
-#define MPT_TFORMAT(f) mpt::format_counted_typed<mpt::parse_format_string_argument_count(TEXT(f)), mpt::tstring>(TEXT(f))
+#define MPT_TFORMAT(f) mpt::format_message_typed<mpt::ToStringFormatter, mpt::parse_format_string_argument_count(TEXT(f)), mpt::tstring>(TEXT(f))
 #endif
 
 #if defined(MPT_WITH_MFC)
-#define MPT_CFORMAT(f) mpt::format_counted_typed<mpt::parse_format_string_argument_count(TEXT(f)), CString>(TEXT(f))
+#define MPT_CFORMAT(f) mpt::format_message_typed<mpt::ToStringFormatter, mpt::parse_format_string_argument_count(TEXT(f)), CString>(TEXT(f))
 #endif // MPT_WITH_MFC
 
+
 } // namespace mpt
 
 
Index: common/mptStringParse.cpp
===================================================================
--- common/mptStringParse.cpp	(revision 14628)
+++ common/mptStringParse.cpp	(working copy)
@@ -11,8 +11,7 @@
 #include "stdafx.h"
 #include "mptStringParse.h"
 
-#include <locale>
-#include <sstream>
+#include "mpt/string/parse.hpp"
 
 
 OPENMPT_NAMESPACE_BEGIN
@@ -21,14 +20,7 @@
 template<typename T>
 inline T ConvertStrToHelper(const std::string &str)
 {
-	std::istringstream i(str);
-	i.imbue(std::locale::classic());
-	T x;
-	if(!(i >> x))
-	{
-		return T();
-	}
-	return x;
+	return mpt::ConvertStringTo<T>(str);
 }
 template<> inline bool ConvertStrToHelper(const std::string &str) { return ConvertStrToHelper<int>(str)?true:false; }
 template<> inline signed char ConvertStrToHelper(const std::string &str) { return static_cast<signed char>(ConvertStrToHelper<signed int>(str)); }
@@ -38,14 +30,7 @@
 template<typename T>
 inline T ConvertStrToHelper(const std::wstring &str)
 {
-	std::wistringstream i(str);
-	i.imbue(std::locale::classic());
-	T x;
-	if(!(i >> x))
-	{
-		return T();
-	}
-	return x;
+	return mpt::ConvertStringTo<T>(str);
 }
 template<> inline bool ConvertStrToHelper(const std::wstring &str) { return ConvertStrToHelper<int>(str)?true:false; }
 template<> inline signed char ConvertStrToHelper(const std::wstring &str) { return static_cast<signed char>(ConvertStrToHelper<signed int>(str)); }
@@ -95,14 +80,7 @@
 template<typename T>
 T HexToHelper(const std::string &str)
 {
-	std::istringstream i(str);
-	i.imbue(std::locale::classic());
-	T x;
-	if(!(i >> std::hex >> x))
-	{
-		return T();
-	}
-	return x;
+	return mpt::ConvertHexStringTo<T>(str);
 }
 template<> unsigned char HexToHelper(const std::string &str) { return static_cast<unsigned char>(HexToHelper<unsigned int>(str)); }
 
Index: common/mptUUID.cpp
===================================================================
--- common/mptUUID.cpp	(revision 14628)
+++ common/mptUUID.cpp	(working copy)
@@ -11,21 +11,10 @@
 #include "stdafx.h"
 #include "mptUUID.h"
 
-#include "mptRandom.h"
-#include "mptStringFormat.h"
-#include "Endianness.h"
+#include "mpt/uuid/guid.hpp"
+#include "mpt/uuid/uuid.hpp"
 
-#include <cstdlib>
 
-#if MPT_OS_WINDOWS
-#include <windows.h>
-#include <rpc.h>
-#if defined(MODPLUG_TRACKER) || defined(MPT_WITH_DMO) || MPT_OS_WINDOWS_WINRT
-#include <objbase.h>
-#endif // MODPLUG_TRACKER || MPT_WITH_DMO || MPT_OS_WINDOWS_WINRT
-#endif // MPT_OS_WINDOWS
-
-
 OPENMPT_NAMESPACE_BEGIN
 
 
@@ -38,263 +27,58 @@
 
 #if defined(MODPLUG_TRACKER) || defined(MPT_WITH_DMO)
 
-
 mpt::winstring CLSIDToString(CLSID clsid)
 {
-	std::wstring str;
-	LPOLESTR tmp = nullptr;
-	switch(::StringFromCLSID(clsid, &tmp))
-	{
-	case S_OK:
-		break;
-	case E_OUTOFMEMORY:
-		if(tmp)
-		{
-			::CoTaskMemFree(tmp);
-			tmp = nullptr;
-		}
-		mpt::throw_out_of_memory();
-		break;
-	default:
-		if(tmp)
-		{
-			::CoTaskMemFree(tmp);
-			tmp = nullptr;
-		}
-		throw std::logic_error("StringFromCLSID() failed.");
-		break;
-	}
-	if(!tmp)
-	{
-		throw std::logic_error("StringFromCLSID() failed.");
-	}
-	try
-	{
-		str = tmp;
-	} catch(mpt::out_of_memory e)
-	{
-		::CoTaskMemFree(tmp);
-		tmp = nullptr;
-		mpt::rethrow_out_of_memory(e);
-	}
-	::CoTaskMemFree(tmp);
-	tmp = nullptr;
-	return mpt::ToWin(str);
+	return mpt::CLSIDToString(clsid);
 }
 
-
-CLSID StringToCLSID(const mpt::winstring &str_)
+CLSID StringToCLSID(const mpt::winstring& str_)
 {
-	const std::wstring str = mpt::ToWide(str_);
-	CLSID clsid = CLSID();
-	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
-	switch(::CLSIDFromString(tmp.data(), &clsid))
-	{
-	case NOERROR:
-		// nothing
-		break;
-	case E_INVALIDARG:
-		clsid = CLSID();
-		break;
-	case CO_E_CLASSSTRING:
-		clsid = CLSID();
-		break;
-	case REGDB_E_CLASSNOTREG:
-		clsid = CLSID();
-		break;
-	case REGDB_E_READREGDB:
-		clsid = CLSID();
-		throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
-		break;
-	default:
-		clsid = CLSID();
-		throw std::logic_error("CLSIDFromString() failed.");
-		break;
-	}
-	return clsid;
+	return mpt::StringToCLSID(str_);
 }
 
-
 bool VerifyStringToCLSID(const mpt::winstring &str_, CLSID &clsid)
 {
-	const std::wstring str = mpt::ToWide(str_);
-	bool result = false;
-	clsid = CLSID();
-	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
-	switch(::CLSIDFromString(tmp.data(), &clsid))
-	{
-	case NOERROR:
-		result = true;
-		break;
-	case E_INVALIDARG:
-		result = false;
-		break;
-	case CO_E_CLASSSTRING:
-		result = false;
-		break;
-	case REGDB_E_CLASSNOTREG:
-		result = false;
-		break;
-	case REGDB_E_READREGDB:
-		throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
-		break;
-	default:
-		throw std::logic_error("CLSIDFromString() failed.");
-		break;
-	}
-	return result;
+	return mpt::VerifyStringToCLSID(str_, clsid);
 }
 
-
 bool IsCLSID(const mpt::winstring &str_)
 {
-	const std::wstring str = mpt::ToWide(str_);
-	bool result = false;
-	CLSID clsid = CLSID();
-	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
-	switch(::CLSIDFromString(tmp.data(), &clsid))
-	{
-	case NOERROR:
-		result = true;
-		break;
-	case E_INVALIDARG:
-		result = false;
-		break;
-	case CO_E_CLASSSTRING:
-		result = false;
-		break;
-	case REGDB_E_CLASSNOTREG:
-		result = false;
-		break;
-	case REGDB_E_READREGDB:
-		result = false;
-		throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
-		break;
-	default:
-		result = false;
-		throw std::logic_error("CLSIDFromString() failed.");
-		break;
-	}
-	return result;
+	return mpt::IsCLSID(str_);
 }
 
 
 mpt::winstring IIDToString(IID iid)
 {
-	std::wstring str;
-	LPOLESTR tmp = nullptr;
-	switch(::StringFromIID(iid, &tmp))
-	{
-	case S_OK:
-		break;
-	case E_OUTOFMEMORY:
-		if(tmp)
-		{
-			::CoTaskMemFree(tmp);
-			tmp = nullptr;
-		}
-		mpt::throw_out_of_memory();
-		break;
-	default:
-		if(tmp)
-		{
-			::CoTaskMemFree(tmp);
-			tmp = nullptr;
-		}
-		throw std::logic_error("StringFromIID() failed.");
-		break;
-	}
-	if(!tmp)
-	{
-		throw std::logic_error("StringFromIID() failed.");
-	}
-	try
-	{
-		str = tmp;
-	} catch(mpt::out_of_memory e)
-	{
-		::CoTaskMemFree(tmp);
-		tmp = nullptr;
-		mpt::rethrow_out_of_memory(e);
-	}
-	return mpt::ToWin(str);
+	return mpt::IIDToString(iid);
 }
 
-
 IID StringToIID(const mpt::winstring &str_)
 {
-	const std::wstring str = mpt::ToWide(str_);
-	IID iid = IID();
-	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
-	switch(::IIDFromString(tmp.data(), &iid))
-	{
-	case S_OK:
-		// nothing
-		break;
-	case E_OUTOFMEMORY:
-		iid = IID();
-		mpt::throw_out_of_memory();
-		break;
-	case E_INVALIDARG:
-		iid = IID();
-		break;
-	default:
-		iid = IID();
-		throw std::logic_error("IIDFromString() failed.");
-		break;
-	}
-	return iid;
+	return mpt::StringToIID(str_);
 }
 
 
 mpt::winstring GUIDToString(GUID guid)
 {
-	std::vector<OLECHAR> tmp(256);
-	if(::StringFromGUID2(guid, tmp.data(), static_cast<int>(tmp.size())) <= 0)
-	{
-		throw std::logic_error("StringFromGUID2() failed.");
-	}
-	return mpt::ToWin(tmp.data());
+	return mpt::GUIDToString(guid);
 }
 
-
 GUID StringToGUID(const mpt::winstring &str)
 {
-	return StringToIID(str);
+	return mpt::StringToGUID(str);
 }
 
 
 GUID CreateGUID()
 {
-	GUID guid = GUID();
-	switch(::CoCreateGuid(&guid))
-	{
-	case S_OK:
-		// nothing
-		break;
-	default:
-		guid = GUID();
-		throw std::runtime_error("CoCreateGuid() failed.");
-	}
-	return guid;
+	return mpt::CreateGUID();
 }
 
 
 bool IsValid(UUID uuid)
 {
-	return false
-		|| uuid.Data1 != 0
-		|| uuid.Data2 != 0
-		|| uuid.Data3 != 0
-		|| uuid.Data4[0] != 0
-		|| uuid.Data4[1] != 0
-		|| uuid.Data4[2] != 0
-		|| uuid.Data4[3] != 0
-		|| uuid.Data4[4] != 0
-		|| uuid.Data4[5] != 0
-		|| uuid.Data4[6] != 0
-		|| uuid.Data4[7] != 0
-		;
+	return mpt::IsValid(uuid);
 }
 
 
@@ -307,264 +91,4 @@
 #endif // MPT_OS_WINDOWS
 
 
-namespace mpt
-{
-
-#if MPT_OS_WINDOWS
-
-static mpt::UUID UUIDFromWin32(::UUID uuid)
-{
-	return mpt::UUID
-		( uuid.Data1
-		, uuid.Data2
-		, uuid.Data3
-		, (static_cast<uint64>(0)
-			| (static_cast<uint64>(uuid.Data4[0]) << 56)
-			| (static_cast<uint64>(uuid.Data4[1]) << 48)
-			| (static_cast<uint64>(uuid.Data4[2]) << 40)
-			| (static_cast<uint64>(uuid.Data4[3]) << 32)
-			| (static_cast<uint64>(uuid.Data4[4]) << 24)
-			| (static_cast<uint64>(uuid.Data4[5]) << 16)
-			| (static_cast<uint64>(uuid.Data4[6]) <<  8)
-			| (static_cast<uint64>(uuid.Data4[7]) <<  0)
-			)
-		);
-}
-
-#if defined(MODPLUG_TRACKER) || defined(MPT_WITH_DMO)
-
-static ::UUID UUIDToWin32(mpt::UUID uuid)
-{
-	::UUID result = ::UUID();
-	result.Data1 = uuid.GetData1();
-	result.Data2 = uuid.GetData2();
-	result.Data3 = uuid.GetData3();
-	result.Data4[0] = static_cast<uint8>(uuid.GetData4() >> 56);
-	result.Data4[1] = static_cast<uint8>(uuid.GetData4() >> 48);
-	result.Data4[2] = static_cast<uint8>(uuid.GetData4() >> 40);
-	result.Data4[3] = static_cast<uint8>(uuid.GetData4() >> 32);
-	result.Data4[4] = static_cast<uint8>(uuid.GetData4() >> 24);
-	result.Data4[5] = static_cast<uint8>(uuid.GetData4() >> 16);
-	result.Data4[6] = static_cast<uint8>(uuid.GetData4() >>  8);
-	result.Data4[7] = static_cast<uint8>(uuid.GetData4() >>  0);
-	return result;
-}
-
-UUID::UUID(::UUID uuid)
-{
-	*this = UUIDFromWin32(uuid);
-}
-
-UUID::operator ::UUID () const
-{
-	return UUIDToWin32(*this);
-}
-
-#endif // MODPLUG_TRACKER || MPT_WITH_DMO
-
-#endif // MPT_OS_WINDOWS
-
-UUID UUID::Generate()
-{
-	#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
-		#if (_WIN32_WINNT >= 0x0602)
-			::GUID guid = ::GUID();
-			HRESULT result = CoCreateGuid(&guid);
-			if(result != S_OK)
-			{
-				return mpt::UUID::RFC4122Random();
-			}
-			return mpt::UUIDFromWin32(guid);
-		#else
-			return mpt::UUID::RFC4122Random();
-		#endif
-	#elif MPT_OS_WINDOWS && !MPT_OS_WINDOWS_WINRT
-		::UUID uuid = ::UUID();
-		RPC_STATUS status = ::UuidCreate(&uuid);
-		if(status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY)
-		{
-			return mpt::UUID::RFC4122Random();
-		}
-		status = RPC_S_OK;
-		if(UuidIsNil(&uuid, &status) != FALSE)
-		{
-			return mpt::UUID::RFC4122Random();
-		}
-		if(status != RPC_S_OK)
-		{
-			return mpt::UUID::RFC4122Random();
-		}
-		return mpt::UUIDFromWin32(uuid);
-	#else
-		return RFC4122Random();
-	#endif
-}
-
-UUID UUID::GenerateLocalUseOnly()
-{
-	#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
-		#if (_WIN32_WINNT >= 0x0602)
-			::GUID guid = ::GUID();
-			HRESULT result = CoCreateGuid(&guid);
-			if(result != S_OK)
-			{
-				return mpt::UUID::RFC4122Random();
-			}
-			return mpt::UUIDFromWin32(guid);
-		#else
-			return mpt::UUID::RFC4122Random();
-		#endif
-	#elif MPT_OS_WINDOWS && !MPT_OS_WINDOWS_WINRT
-		#if _WIN32_WINNT >= 0x0501
-			// Available since Win2000, but we check for WinXP in order to not use this
-			// function in Win32old builds. It is not available on some non-fully
-			// patched Win98SE installs in the wild.
-			::UUID uuid = ::UUID();
-			RPC_STATUS status = ::UuidCreateSequential(&uuid);
-			if(status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY)
-			{
-				return Generate();
-			}
-			status = RPC_S_OK;
-			if(UuidIsNil(&uuid, &status) != FALSE)
-			{
-				return mpt::UUID::RFC4122Random();
-			}
-			if(status != RPC_S_OK)
-			{
-				return mpt::UUID::RFC4122Random();
-			}
-			return mpt::UUIDFromWin32(uuid);
-		#else
-			// Fallback to ::UuidCreate is safe as ::UuidCreateSequential is only a
-			// tiny performance optimization.
-			return Generate();
-		#endif
-	#else
-		return RFC4122Random();
-	#endif
-}
-
-UUID UUID::RFC4122Random()
-{
-	UUID result;
-	mpt::thread_safe_prng<mpt::default_prng> & prng = mpt::global_prng();
-	result.Data1 = mpt::random<uint32>(prng);
-	result.Data2 = mpt::random<uint16>(prng);
-	result.Data3 = mpt::random<uint16>(prng);
-	result.Data4 = mpt::random<uint64>(prng);
-	result.MakeRFC4122(4);
-	return result;
-}
-
-void UUID::MakeRFC4122(uint8 version) noexcept
-{
-	// variant
-	uint8 Nn = static_cast<uint8>((Data4 >> 56) & 0xffu);
-	Data4 &= 0x00ffffffffffffffull;
-	Nn &= ~(0xc0u);
-	Nn |= 0x80u;
-	Data4 |= static_cast<uint64>(Nn) << 56;
-	// version
-	version &= 0x0fu;
-	uint8 Mm = static_cast<uint8>((Data3 >> 8) & 0xffu);
-	Data3 &= 0x00ffu;
-	Mm &= ~(0xf0u);
-	Mm |= (version << 4u);
-	Data3 |= static_cast<uint16>(Mm) << 8;
-}
-
-UUID UUID::FromString(const mpt::ustring &str)
-{
-	std::vector<mpt::ustring> segments = mpt::String::Split<mpt::ustring>(str, U_("-"));
-	if(segments.size() != 5)
-	{
-		return UUID();
-	}
-	if(segments[0].length() != 8)
-	{
-		return UUID();
-	}
-	if(segments[1].length() != 4)
-	{
-		return UUID();
-	}
-	if(segments[2].length() != 4)
-	{
-		return UUID();
-	}
-	if(segments[3].length() != 4)
-	{
-		return UUID();
-	}
-	if(segments[4].length() != 12)
-	{
-		return UUID();
-	}
-	UUID result;
-	result.Data1 = mpt::String::Parse::Hex<uint32>(segments[0]);
-	result.Data2 = mpt::String::Parse::Hex<uint16>(segments[1]);
-	result.Data3 = mpt::String::Parse::Hex<uint16>(segments[2]);
-	result.Data4 = mpt::String::Parse::Hex<uint64>(segments[3] + segments[4]);
-	return result;
-}
-
-mpt::ustring UUID::ToUString() const
-{
-	return mpt::ustring()
-		+ mpt::ufmt::hex0<8>(GetData1())
-		+ U_("-")
-		+ mpt::ufmt::hex0<4>(GetData2())
-		+ U_("-")
-		+ mpt::ufmt::hex0<4>(GetData3())
-		+ U_("-")
-		+ mpt::ufmt::hex0<4>(static_cast<uint16>(GetData4() >> 48))
-		+ U_("-")
-		+ mpt::ufmt::hex0<4>(static_cast<uint16>(GetData4() >> 32))
-		+ mpt::ufmt::hex0<8>(static_cast<uint32>(GetData4() >>  0))
-		;
-}
-
-UUID::UUID(UUIDbin uuid)
-{
-	Data1 = uuid.Data1.get();
-	Data2 = uuid.Data2.get();
-	Data3 = uuid.Data3.get();
-	Data4 = uuid.Data4.get();
-}
-
-UUID::UUID(GUIDms guid)
-{
-	Data1 = guid.Data1.get();
-	Data2 = guid.Data2.get();
-	Data3 = guid.Data3.get();
-	Data4 = guid.Data4.get();
-}
-
-UUID::operator UUIDbin() const
-{
-	UUIDbin result;
-	Clear(result);
-	result.Data1 = GetData1();
-	result.Data2 = GetData2();
-	result.Data3 = GetData3();
-	result.Data4 = GetData4();
-	return result;
-}
-
-UUID::operator GUIDms() const
-{
-	GUIDms result;
-	Clear(result);
-	result.Data1 = GetData1();
-	result.Data2 = GetData2();
-	result.Data3 = GetData3();
-	result.Data4 = GetData4();
-	return result;
-}
-
-
-} // namespace mpt
-
-
 OPENMPT_NAMESPACE_END
Index: common/mptUUID.h
===================================================================
--- common/mptUUID.h	(revision 14628)
+++ common/mptUUID.h	(working copy)
@@ -12,6 +12,7 @@
 
 #include "BuildSettings.h"
 
+#include "mpt/uuid/uuid.hpp"
 
 #include "Endianness.h"
 
@@ -64,148 +65,8 @@
 
 #endif // MPT_OS_WINDOWS
 
-// Microsoft on-disk layout
-struct GUIDms
-{
-	uint32le Data1;
-	uint16le Data2;
-	uint16le Data3;
-	uint64be Data4; // yes, big endian here
-};
-MPT_BINARY_STRUCT(GUIDms, 16)
 
-// RFC binary format
-struct UUIDbin
-{
-	uint32be Data1;
-	uint16be Data2;
-	uint16be Data3;
-	uint64be Data4;
-};
-MPT_BINARY_STRUCT(UUIDbin, 16)
+using namespace mpt::uuid_literals;
 
-namespace mpt {
 
-struct UUID
-{
-private:
-	uint32 Data1;
-	uint16 Data2;
-	uint16 Data3;
-	uint64 Data4;
-public:
-	MPT_CONSTEXPRINLINE uint32 GetData1() const noexcept { return Data1; }
-	MPT_CONSTEXPRINLINE uint16 GetData2() const noexcept { return Data2; }
-	MPT_CONSTEXPRINLINE uint16 GetData3() const noexcept { return Data3; }
-	MPT_CONSTEXPRINLINE uint64 GetData4() const noexcept { return Data4; }
-public:
-	MPT_CONSTEXPRINLINE uint64 GetData64_1() const noexcept { return (static_cast<uint64>(Data1) << 32) | (static_cast<uint64>(Data2) << 16) | (static_cast<uint64>(Data3) << 0); }
-	MPT_CONSTEXPRINLINE uint64 GetData64_2() const noexcept { return Data4; }
-public:
-	// xxxxxxxx-xxxx-Mmxx-Nnxx-xxxxxxxxxxxx
-	// <--32-->-<16>-<16>-<-------64------>
-	MPT_CONSTEXPRINLINE bool IsNil() const noexcept { return (Data1 == 0) && (Data2 == 0) && (Data3 == 0) && (Data4 == 0); }
-	MPT_CONSTEXPRINLINE bool IsValid() const noexcept { return (Data1 != 0) || (Data2 != 0) || (Data3 != 0) || (Data4 != 0); }
-	MPT_CONSTEXPRINLINE uint8 Variant() const noexcept { return Nn() >> 4u; }
-	MPT_CONSTEXPRINLINE uint8 Version() const noexcept { return Mm() >> 4u; }
-	MPT_CONSTEXPRINLINE bool IsRFC4122() const noexcept { return (Variant() & 0xcu) == 0x8u; }
-private:
-	MPT_CONSTEXPRINLINE uint8 Mm() const noexcept { return static_cast<uint8>((Data3 >> 8) & 0xffu); }
-	MPT_CONSTEXPRINLINE uint8 Nn() const noexcept { return static_cast<uint8>((Data4 >> 56) & 0xffu); }
-	void MakeRFC4122(uint8 version) noexcept;
-public:
-#if MPT_OS_WINDOWS && (defined(MODPLUG_TRACKER) || defined(MPT_WITH_DMO))
-	explicit UUID(::UUID uuid);
-	operator ::UUID () const;
-#endif // MPT_OS_WINDOWS && (MODPLUG_TRACKER || MPT_WITH_DMO)
-private:
-	static MPT_CONSTEXPRINLINE uint8 NibbleFromChar(char x)
-	{
-		return
-			('0' <= x && x <= '9') ? static_cast<uint8>(x - '0' +  0) :
-			('a' <= x && x <= 'z') ? static_cast<uint8>(x - 'a' + 10) :
-			('A' <= x && x <= 'Z') ? static_cast<uint8>(x - 'A' + 10) :
-			mpt::constexpr_throw<uint8>(std::domain_error(""));
-	}
-	static MPT_CONSTEXPRINLINE uint8 ByteFromHex(char x, char y)
-	{
-		return static_cast<uint8>(uint8(0)
-			| (NibbleFromChar(x) << 4)
-			| (NibbleFromChar(y) << 0)
-			);
-	}
-	static MPT_CONSTEXPRINLINE uint16 ParseHex16(const char * str)
-	{
-		return static_cast<uint16>(uint16(0)
-			| (static_cast<uint16>(ByteFromHex(str[0], str[1])) << 8)
-			| (static_cast<uint16>(ByteFromHex(str[2], str[3])) << 0)
-			);
-	}
-	static MPT_CONSTEXPRINLINE uint32 ParseHex32(const char * str)
-	{
-		return static_cast<uint32>(uint32(0)
-			| (static_cast<uint32>(ByteFromHex(str[0], str[1])) << 24)
-			| (static_cast<uint32>(ByteFromHex(str[2], str[3])) << 16)
-			| (static_cast<uint32>(ByteFromHex(str[4], str[5])) <<  8)
-			| (static_cast<uint32>(ByteFromHex(str[6], str[7])) <<  0)
-			);
-	}
-public:
-	static MPT_CONSTEXPRINLINE UUID ParseLiteral(const char * str, std::size_t len)
-	{
-		return
-			(len == 36 && str[8] == '-' && str[13] == '-' && str[18] == '-' && str[23] == '-') ?
-			mpt::UUID(
-				ParseHex32(str + 0),
-				ParseHex16(str + 9),
-				ParseHex16(str + 14),
-				uint64(0)
-					| (static_cast<uint64>(ParseHex16(str + 19)) << 48)
-					| (static_cast<uint64>(ParseHex16(str + 24)) << 32)
-					| (static_cast<uint64>(ParseHex32(str + 28)) <<  0)
-			)
-			: mpt::constexpr_throw<mpt::UUID>(std::domain_error(""));
-	}
-public:
-	MPT_CONSTEXPRINLINE UUID() noexcept : Data1(0), Data2(0), Data3(0), Data4(0) { }
-	MPT_CONSTEXPRINLINE explicit UUID(uint32 Data1, uint16 Data2, uint16 Data3, uint64 Data4) noexcept : Data1(Data1), Data2(Data2), Data3(Data3), Data4(Data4) { }
-	explicit UUID(UUIDbin uuid);
-	explicit UUID(GUIDms guid);
-	operator UUIDbin () const;
-	operator GUIDms () const;
-public:
-	// Create a UUID
-	static UUID Generate();
-	// Create a UUID that contains local, traceable information.
-	// Safe for local use. May be faster.
-	static UUID GenerateLocalUseOnly();
-	// Create a RFC4122 Random UUID.
-	static UUID RFC4122Random();
-	friend UUID UUIDRFC4122NamespaceV3(const UUID &ns, const mpt::ustring &name);
-	friend UUID UUIDRFC4122NamespaceV5(const UUID &ns, const mpt::ustring &name);
-public:
-	// General UUID<->string conversion.
-	// The string must/will be in standard UUID format: 4f9a455d-e7ef-4367-b2f0-0c83a38a5c72
-	static UUID FromString(const mpt::ustring &str);
-	mpt::ustring ToUString() const;
-};
-
-MPT_CONSTEXPRINLINE bool operator==(const mpt::UUID & a, const mpt::UUID & b) noexcept
-{
-	return (a.GetData1() == b.GetData1()) && (a.GetData2() == b.GetData2()) && (a.GetData3() == b.GetData3()) && (a.GetData4() == b.GetData4());
-}
-MPT_CONSTEXPRINLINE bool operator!=(const mpt::UUID & a, const mpt::UUID & b) noexcept
-{
-	return (a.GetData1() != b.GetData1()) || (a.GetData2() != b.GetData2()) || (a.GetData3() != b.GetData3()) || (a.GetData4() != b.GetData4());	
-}
-
-} // namespace mpt
-
-
-MPT_CONSTEXPRINLINE mpt::UUID operator "" _uuid (const char * str, std::size_t len)
-{
-	return mpt::UUID::ParseLiteral(str, len);
-}
-
-
 OPENMPT_NAMESPACE_END
Index: common/stdafx.h
===================================================================
--- common/stdafx.h	(revision 14628)
+++ common/stdafx.h	(working copy)
@@ -58,6 +58,14 @@
 #endif
 
 
+#include "mpt/check/libc.hpp"
+#if defined(MPT_WITH_MFC)
+#include "mpt/check/mfc.hpp"
+#endif
+#if MPT_OS_WINDOWS
+#include "mpt/check/windows.hpp"
+#endif
+
 // this will be available everywhere
 
 #include "../common/mptBaseMacros.h"
Index: doc/year_changed.md
===================================================================
--- doc/year_changed.md	(revision 14628)
+++ doc/year_changed.md	(working copy)
@@ -3,6 +3,7 @@
 ==========================================
 
  *  `LICENSE` (1 occurrence)
+ *  `src/mpt/LICENSE.BSD-3-Clause.txt` (1 occurrence)
  *  `common/version.cpp` (2 occurrences plus 1 for each current contributor)
  *  `mptrack/res/MPTRACK.RC2` (1 occurence)
  *  `pluginBridge/PluginBridge.rc` (1 occurence)
Index: installer/signtool/signtool.cpp
===================================================================
--- installer/signtool/signtool.cpp	(revision 14628)
+++ installer/signtool/signtool.cpp	(working copy)
@@ -1,6 +1,8 @@
 
 #include "BuildSettings.h"
 
+#include "mpt/environment/environment.hpp"
+
 #include "../common/mptBaseMacros.h"
 #include "../common/mptBaseTypes.h"
 #include "../common/mptBaseUtils.h"
Index: libopenmpt/libopenmpt_ext_impl.cpp
===================================================================
--- libopenmpt/libopenmpt_ext_impl.cpp	(revision 14628)
+++ libopenmpt/libopenmpt_ext_impl.cpp	(working copy)
@@ -21,6 +21,9 @@
 #ifndef MPT_NO_NAMESPACE
 using namespace OPENMPT_NAMESPACE;
 #endif
+namespace openmpt {
+	namespace mpt = OPENMPT_NAMESPACE::mpt;
+} // namespace openmpt
 
 namespace openmpt {
 
Index: libopenmpt/libopenmpt_impl.cpp
===================================================================
--- libopenmpt/libopenmpt_impl.cpp	(revision 14628)
+++ libopenmpt/libopenmpt_impl.cpp	(working copy)
@@ -99,6 +99,9 @@
 #ifndef MPT_NO_NAMESPACE
 using namespace OPENMPT_NAMESPACE;
 #endif
+namespace openmpt {
+	namespace mpt = OPENMPT_NAMESPACE::mpt;
+} // namespace openmpt
 
 namespace openmpt {
 
Index: Makefile
===================================================================
--- Makefile	(revision 14628)
+++ Makefile	(working copy)
@@ -314,7 +314,7 @@
 INSTALL_DATA_DIR = $(INSTALL_DIR)
 INSTALL_MAKE_DIR += -m 0755
 
-CPPFLAGS += -Icommon -I. -Iinclude
+CPPFLAGS += -Isrc -Icommon -I. -Iinclude
 
 ifeq ($(XMP_OPENMPT),1)
 CPPFLAGS += -Iinclude/pugixml/src
@@ -859,6 +859,7 @@
 
 COMMON_CXX_SOURCES += \
  $(sort $(wildcard common/*.cpp)) \
+ $(sort $(wildcard src/mpt/src/*.cpp)) \
  
 SOUNDLIB_CXX_SOURCES += \
  $(COMMON_CXX_SOURCES) \
@@ -1354,6 +1355,8 @@
 	mkdir -p bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/build
 	mkdir -p bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/doc
 	mkdir -p bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/include
+	mkdir -p bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src
+	mkdir -p bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt
 	svn export ./LICENSE            bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/LICENSE
 	svn export ./README.md          bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/README.md
 	svn export ./Makefile           bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/Makefile
@@ -1369,6 +1372,25 @@
 	svn export ./soundbase          bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/soundbase
 	svn export ./soundlib           bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/soundlib
 	svn export ./sounddsp           bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/sounddsp
+	svn export ./src/mpt/base           bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/base
+	svn export ./src/mpt/binary         bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/binary
+	svn export ./src/mpt/check          bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/check
+	svn export ./src/mpt/crc            bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/crc
+	#svn export ./src/mpt/crypto         bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/crypto
+	svn export ./src/mpt/detect         bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/detect
+	svn export ./src/mpt/endian         bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/endian
+	svn export ./src/mpt/environment    bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/environment
+	svn export ./src/mpt/exception_text bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/exception_text
+	#svn export ./src/mpt/json           bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/json
+	svn export ./src/mpt/mutex          bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/mutex
+	svn export ./src/mpt/out_of_memory  bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/out_of_memory
+	svn export ./src/mpt/osinfo         bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/osinfo
+	svn export ./src/mpt/random         bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/random
+	svn export ./src/mpt/string         bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/string
+	svn export ./src/mpt/system_error   bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/system_error
+	svn export ./src/mpt/test           bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/test
+	svn export ./src/mpt/uuid           bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/uuid
+	#svn export ./src/mpt/uuid_namespace bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/uuid_namespace
 	svn export ./test               bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/test
 	svn export ./libopenmpt         bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/libopenmpt
 	svn export ./examples           bin/dist-tar/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/examples
@@ -1393,6 +1415,8 @@
 	mkdir -p bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/build/premake
 	mkdir -p bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/doc
 	mkdir -p bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/include
+	mkdir -p bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src
+	mkdir -p bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt
 	svn export ./LICENSE               bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/LICENSE               --native-eol CRLF
 	svn export ./README.md             bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/README.md             --native-eol CRLF
 	svn export ./Makefile              bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/Makefile              --native-eol CRLF
@@ -1421,6 +1445,26 @@
 	svn export ./soundbase             bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/soundbase             --native-eol CRLF
 	svn export ./soundlib              bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/soundlib              --native-eol CRLF
 	svn export ./sounddsp              bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/sounddsp              --native-eol CRLF
+	svn export ./src/mpt/base           bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/base           --native-eol CRLF
+	svn export ./src/mpt/binary         bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/binary         --native-eol CRLF
+	svn export ./src/mpt/check          bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/check          --native-eol CRLF
+	svn export ./src/mpt/crc            bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/crc            --native-eol CRLF
+	#svn export ./src/mpt/crypto         bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/crypto         --native-eol CRLF
+	svn export ./src/mpt/detect         bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/detect         --native-eol CRLF
+	svn export ./src/mpt/endian         bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/endian         --native-eol CRLF
+	svn export ./src/mpt/environment    bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/environment    --native-eol CRLF
+	svn export ./src/mpt/exception_text bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/exception_text --native-eol CRLF
+	#svn export ./src/mpt/json           bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/json           --native-eol CRLF
+	svn export ./src/mpt/mutex          bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/mutex          --native-eol CRLF
+	svn export ./src/mpt/out_of_memory  bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/out_of_memory  --native-eol CRLF
+	svn export ./src/mpt/osinfo         bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/osinfo         --native-eol CRLF
+	svn export ./src/mpt/random         bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/random         --native-eol CRLF
+	svn export ./src/mpt/string         bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/string         --native-eol CRLF
+	svn export ./src/mpt/system_error   bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/system_error   --native-eol CRLF
+	svn export ./src/mpt/test           bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/test           --native-eol CRLF
+	svn export ./src/mpt/uuid           bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/uuid           --native-eol CRLF
+	#svn export ./src/mpt/uuid_namespace bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt/uuid_namespace --native-eol CRLF
+	svn export ./src/mpt               bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/src/mpt               --native-eol CRLF
 	svn export ./test                  bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/test                  --native-eol CRLF
 	svn export ./libopenmpt            bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/libopenmpt            --native-eol CRLF
 	svn export ./examples              bin/dist-zip/libopenmpt-$(DIST_LIBOPENMPT_VERSION)/examples              --native-eol CRLF
Index: misc/JSON.h
===================================================================
--- misc/JSON.h	(revision 14628)
+++ misc/JSON.h	(working copy)
@@ -3,9 +3,9 @@
 
 #include "BuildSettings.h"
 
+#include "mpt/json/json.hpp"
 
 #ifdef MPT_WITH_NLOHMANNJSON
-#include <optional>
 #if MPT_COMPILER_CLANG
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wmismatched-tags"
@@ -16,71 +16,8 @@
 #endif // MPT_COMPILER_CLANG
 #endif // MPT_WITH_NLOHMANNJSON
 
-#ifdef MPT_WITH_NLOHMANNJSON
-
-namespace nlohmann
-{
-	template <>
-	struct adl_serializer<OPENMPT_NAMESPACE::mpt::ustring>
-	{
-		static void to_json(json& j, const OPENMPT_NAMESPACE::mpt::ustring& val)
-		{
-			j = OPENMPT_NAMESPACE::mpt::ToCharset(OPENMPT_NAMESPACE::mpt::Charset::UTF8, val);
-		}
-		static void from_json(const json& j, OPENMPT_NAMESPACE::mpt::ustring& val)
-		{
-			val = OPENMPT_NAMESPACE::mpt::ToUnicode(OPENMPT_NAMESPACE::mpt::Charset::UTF8, j.get<std::string>());
-		}
-	};
-	template <typename Tvalue>
-	struct adl_serializer<std::map<OPENMPT_NAMESPACE::mpt::ustring, Tvalue>>
-	{
-		static void to_json(json& j, const std::map<OPENMPT_NAMESPACE::mpt::ustring, Tvalue>& val)
-		{
-			std::map<std::string, Tvalue> utf8map;
-			for(const auto &value : val)
-			{
-				utf8map[OPENMPT_NAMESPACE::mpt::ToCharset(OPENMPT_NAMESPACE::mpt::Charset::UTF8, value.first)] = value.second;
-			}
-			j = std::move(utf8map);
-		}
-		static void from_json(const json& j, std::map<OPENMPT_NAMESPACE::mpt::ustring, Tvalue>& val)
-		{
-			std::map<std::string, Tvalue> utf8map = j.get<std::map<std::string, Tvalue>>();
-			std::map<OPENMPT_NAMESPACE::mpt::ustring, Tvalue> result;
-			for(const auto &value : utf8map)
-			{
-				result[OPENMPT_NAMESPACE::mpt::ToUnicode(OPENMPT_NAMESPACE::mpt::Charset::UTF8, value.first)] = value.second;
-			}
-			val = std::move(result);
-		}
-	};
-	template <typename Tvalue>
-	struct adl_serializer<std::optional<Tvalue>>
-	{
-		static void to_json(json& j, const std::optional<Tvalue>& val)
-		{
-			j = (val ? json{*val} : json{nullptr});
-		}
-		static void from_json(const json& j, std::optional<Tvalue>& val)
-		{
-			if(!j.is_null())
-			{
-				val = j.get<Tvalue>();
-			} else
-			{
-				val = std::nullopt;
-			}
-		}
-	};
-} // namespace nlohmann
-
-#endif // MPT_WITH_NLOHMANNJSON
-
-
 OPENMPT_NAMESPACE_BEGIN
 
-
 #ifdef MPT_WITH_NLOHMANNJSON
 
 namespace JSON {
@@ -111,5 +48,4 @@
 
 #endif // MPT_WITH_NLOHMANNJSON
 
-
 OPENMPT_NAMESPACE_END
Index: misc/mptCrypto.cpp
===================================================================
--- misc/mptCrypto.cpp	(revision 14628)
+++ misc/mptCrypto.cpp	(nonexistent)
@@ -1,48 +0,0 @@
-/*
- * mptCrypto.cpp
- * -------------
- * Purpose: .
- * Notes  : (currently none)
- * Authors: Joern Heusipp
- * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
- */
-
-#include "stdafx.h"
-#include "mptCrypto.h"
-
-#include "../common/mptAssert.h"
-#include "../common/mptBaseMacros.h"
-#include "../common/mptBaseTypes.h"
-#include "../common/mptBaseUtils.h"
-#include "../common/mptException.h"
-#include "../common/mptSpan.h"
-
-#include <algorithm>
-#include <vector>
-
-#include <cstddef>
-#include <cstdint>
-
-#ifdef MODPLUG_TRACKER
-#if MPT_OS_WINDOWS
-#include <windows.h>
-#include <bcrypt.h>
-#include <ncrypt.h>
-#endif // MPT_OS_WINDOWS
-#endif // MODPLUG_TRACKER
-
-
-OPENMPT_NAMESPACE_BEGIN
-
-
-namespace mpt
-{
-
-
-MPT_MSVC_WORKAROUND_LNK4221(mptCrypto)
-
-
-} // namespace mpt
-
-
-OPENMPT_NAMESPACE_END

Property changes on: misc/mptCrypto.cpp
___________________________________________________________________
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:mime-type
## -1 +0,0 ##
-text/x-c++src
\ No newline at end of property
Index: misc/mptCrypto.h
===================================================================
--- misc/mptCrypto.h	(revision 14628)
+++ misc/mptCrypto.h	(working copy)
@@ -11,847 +11,5 @@
 
 #include "BuildSettings.h"
 
-#include "../common/mptAssert.h"
-#include "../common/mptBaseMacros.h"
-#include "../common/mptBaseTypes.h"
-#include "../common/mptBaseUtils.h"
-#include "../common/mptException.h"
-#include "../common/mptSpan.h"
-#include "../common/mptStringParse.h"
-
-#include "../common/misc_util.h"
-
-#ifdef MODPLUG_TRACKER
-#include "../misc/JSON.h"
-#endif // MODPLUG_TRACKER
-
-#include <algorithm>
-#include <vector>
-
-#include <cstddef>
-#include <cstdint>
-
-#ifdef MODPLUG_TRACKER
-#if MPT_OS_WINDOWS
-#include <windows.h>
-#include <wincrypt.h>
-#include <bcrypt.h>
-#include <ncrypt.h>
-#endif // MPT_OS_WINDOWS
-#endif // MODPLUG_TRACKER
-
-
-
-OPENMPT_NAMESPACE_BEGIN
-
-
-namespace mpt
-{
-
-
-#ifdef MODPLUG_TRACKER
-#if MPT_OS_WINDOWS
-
-
-namespace crypto
-{
-
-
-class exception : public std::runtime_error
-{
-private:
-	NTSTATUS m_Status;
-public:
-	exception(NTSTATUS status)
-		: std::runtime_error("crypto error")
-		, m_Status(status)
-	{
-		return;
-	}
-public:
-	NTSTATUS code() const noexcept
-	{
-		return m_Status;
-	}
-};
-
-
-class security_exception : public std::runtime_error
-{
-private:
-	SECURITY_STATUS m_Status;
-public:
-	security_exception(SECURITY_STATUS status)
-		: std::runtime_error("crypto error")
-		, m_Status(status)
-	{
-		return;
-	}
-public:
-	SECURITY_STATUS code() const noexcept
-	{
-		return m_Status;
-	}
-};
-
-
-inline void CheckNTSTATUS(NTSTATUS status)
-{
-	if(status >= 0)
-	{
-		return;
-	} else if(status == STATUS_NO_MEMORY)
-	{
-		mpt::throw_out_of_memory();
-	} else
-	{
-		throw exception(status);
-	}
-}
-
-
-inline void CheckSECURITY_STATUS(SECURITY_STATUS status)
-{
-	if(status == ERROR_SUCCESS)
-	{
-		return;
-	} else if(status == NTE_NO_MEMORY)
-	{
-		mpt::throw_out_of_memory();
-	} else
-	{
-		throw security_exception(status);
-	}
-}
-
-
-namespace hash
-{
-
-struct hash_traits_md5
-{
-	static constexpr std::size_t output_bits = 128;
-	static constexpr std::size_t output_bytes = output_bits / 8;
-	static constexpr const wchar_t * bcrypt_name = BCRYPT_MD5_ALGORITHM;
-};
-
-struct hash_traits_sha1
-{
-	static constexpr std::size_t output_bits = 160;
-	static constexpr std::size_t output_bytes = output_bits / 8;
-	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA1_ALGORITHM;
-};
-
-struct hash_traits_sha256
-{
-	static constexpr std::size_t output_bits = 256;
-	static constexpr std::size_t output_bytes = output_bits / 8;
-	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA256_ALGORITHM;
-};
-
-struct hash_traits_sha512
-{
-	static constexpr std::size_t output_bits = 512;
-	static constexpr std::size_t output_bytes = output_bits / 8;
-	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA512_ALGORITHM;
-};
-
-template <typename Traits>
-class hash_impl
-{
-
-public:
-
-	using traits = Traits;
-
-	using result_type = std::array<std::byte, traits::output_bytes>;
-	
-private:
-
-	BCRYPT_ALG_HANDLE hAlg = NULL;
-	std::vector<BYTE> hashState;
-	std::vector<BYTE> hashResult;
-	BCRYPT_HASH_HANDLE hHash = NULL;
-
-private:
-
-	void init()
-	{
-		CheckNTSTATUS(BCryptOpenAlgorithmProvider(&hAlg, traits::bcrypt_name, NULL, 0));
-		if(!hAlg)
-		{
-			throw exception(0);
-		}
-		DWORD hashStateSize = 0;
-		DWORD hashStateSizeSize = 0;
-		CheckNTSTATUS(BCryptGetProperty(hAlg, BCRYPT_OBJECT_LENGTH, (PBYTE)&hashStateSize, sizeof(DWORD), &hashStateSizeSize, 0));
-		if(hashStateSizeSize != sizeof(DWORD))
-		{
-			throw exception(0);
-		}
-		if(hashStateSize <= 0)
-		{
-			throw exception(0);
-		}
-		hashState.resize(hashStateSize);
-		DWORD hashResultSize = 0;
-		DWORD hashResultSizeSize = 0;
-		CheckNTSTATUS(BCryptGetProperty(hAlg, BCRYPT_HASH_LENGTH, (PBYTE)&hashResultSize, sizeof(DWORD), &hashResultSizeSize, 0));
-		if(hashResultSizeSize != sizeof(DWORD))
-		{
-			throw exception(0);
-		}
-		if(hashResultSize <= 0)
-		{
-			throw exception(0);
-		}
-		if(hashResultSize != mpt::extent<result_type>())
-		{
-			throw exception(0);
-		}
-		hashResult.resize(hashResultSize);
-		CheckNTSTATUS(BCryptCreateHash(hAlg, &hHash, hashState.data(), hashStateSize, NULL, 0, 0));
-		if(!hHash)
-		{
-			throw exception(0);
-		}
-	}
-
-	void cleanup()
-	{
-		if(hHash)    
-		{
-			BCryptDestroyHash(hHash);
-			hHash = NULL;
-		}
-		hashResult.resize(0);
-		hashResult.shrink_to_fit();
-		hashState.resize(0);
-		hashState.shrink_to_fit();
-		if(hAlg)
-		{
-			BCryptCloseAlgorithmProvider(hAlg, 0);
-			hAlg = NULL;
-		}
-	}
-
-public:
-
-	hash_impl()
-	{
-		try
-		{
-			init();
-		} catch(...)
-		{
-			cleanup();
-			throw;
-		}
-	}
-	hash_impl(const hash_impl &) = delete;
-	hash_impl &operator=(const hash_impl &) = delete;
-	~hash_impl()
-	{
-		cleanup();
-	}
-
-public:
-
-	hash_impl &process(mpt::const_byte_span data)
-	{
-		CheckNTSTATUS(BCryptHashData(hHash, const_cast<UCHAR*>(mpt::byte_cast<const UCHAR*>(data.data())), mpt::saturate_cast<ULONG>(data.size()), 0));
-		return *this;
-	}
-
-	result_type result()
-	{
-		result_type res = mpt::init_array<std::byte, traits::output_bytes>(std::byte{0});
-		CheckNTSTATUS(BCryptFinishHash(hHash, hashResult.data(), mpt::saturate_cast<ULONG>(hashResult.size()), 0));
-		MPT_ASSERT(hashResult.size() == mpt::extent<result_type>());
-		std::transform(hashResult.begin(), hashResult.end(), res.begin(), [](BYTE b){ return mpt::as_byte(b); });
-		return res;
-	}
-
-};
-
-using MD5 = hash_impl<hash_traits_md5>;
-using SHA1 = hash_impl<hash_traits_sha1>;
-using SHA256 = hash_impl<hash_traits_sha256>;
-using SHA512 = hash_impl<hash_traits_sha512>;
-
-
-} // namespace hash
-
-
-class keystore
-{
-public:
-	enum class domain
-	{
-		system = 1,
-		user = 2,
-	};
-private:
-	NCRYPT_PROV_HANDLE hProv = NULL;
-	domain ProvDomain = domain::user;
-private:
-	void cleanup()
-	{
-		if(hProv)
-		{
-			NCryptFreeObject(hProv);
-			hProv = NULL;
-		}
-	}
-public:
-	keystore(domain d)
-		: ProvDomain(d)
-	{
-		try
-		{
-			CheckSECURITY_STATUS(NCryptOpenStorageProvider(&hProv, MS_KEY_STORAGE_PROVIDER, 0));
-		} catch(...)
-		{
-			cleanup();
-			throw;
-		}
-	}
-	~keystore()
-	{
-	}
-	operator NCRYPT_PROV_HANDLE()
-	{
-		return hProv;
-	}
-	keystore::domain store_domain() const
-	{
-		return ProvDomain;
-	}
-};
-
-
-
-namespace asymmetric
-{
-
-
-
-	class signature_verification_failed : public std::runtime_error
-	{
-	public:
-		signature_verification_failed()
-			: std::runtime_error("Signature Verification failed.")
-		{
-			return;
-		}
-	};
-
-
-
-	inline std::vector<mpt::ustring> jws_get_keynames(const mpt::ustring &jws_)
-	{
-		std::vector<mpt::ustring> result;
-		nlohmann::json jws = nlohmann::json::parse(mpt::ToCharset(mpt::Charset::UTF8, jws_));
-		for(const auto & s : jws["signatures"])
-		{
-			result.push_back(s["header"]["kid"]);
-		}
-		return result;
-	}
-
-
-
-	struct RSASSA_PSS_SHA512_traits
-	{
-		using hash_type = mpt::crypto::hash::SHA512;
-		static constexpr const char * jwk_alg = "PS512";
-	};
-
-
-
-	template <typename Traits = RSASSA_PSS_SHA512_traits, std::size_t keysize = 4096>
-	class rsassa_pss
-	{
-
-	public:
-
-		using hash_type = typename Traits::hash_type;
-		static constexpr const char * jwk_alg = Traits::jwk_alg;
-
-		struct public_key_data
-		{
-
-			mpt::ustring name;
-			uint32 length = 0;
-			std::vector<std::byte> public_exp;
-			std::vector<std::byte> modulus;
-
-			std::vector<std::byte> as_cng_blob() const
-			{
-				BCRYPT_RSAKEY_BLOB rsakey_blob;
-				Clear(rsakey_blob);
-				rsakey_blob.Magic = BCRYPT_RSAPUBLIC_MAGIC;
-				rsakey_blob.BitLength = length;
-				rsakey_blob.cbPublicExp = mpt::saturate_cast<ULONG>(public_exp.size());
-				rsakey_blob.cbModulus = mpt::saturate_cast<ULONG>(modulus.size());
-				std::vector<std::byte> result(sizeof(BCRYPT_RSAKEY_BLOB) + public_exp.size() + modulus.size());
-				std::memcpy(result.data(), &rsakey_blob, sizeof(BCRYPT_RSAKEY_BLOB));
-				std::memcpy(result.data() + sizeof(BCRYPT_RSAKEY_BLOB), public_exp.data(), public_exp.size());
-				std::memcpy(result.data() + sizeof(BCRYPT_RSAKEY_BLOB) + public_exp.size(), modulus.data(), modulus.size());
-				return result;
-			}
-
-			mpt::ustring as_jwk() const
-			{
-				nlohmann::json json = nlohmann::json::object();
-				json["kid"] = name;
-				json["kty"] = "RSA";
-				json["alg"] = jwk_alg;
-				json["use"] = "sig";
-				json["e"] = Util::BinToBase64url(mpt::as_span(public_exp));
-				json["n"] = Util::BinToBase64url(mpt::as_span(modulus));
-				return mpt::ToUnicode(mpt::Charset::UTF8, json.dump());
-			}
-
-			static public_key_data from_jwk(const mpt::ustring &jwk)
-			{
-				public_key_data result;
-				try
-				{
-					nlohmann::json json = nlohmann::json::parse(mpt::ToCharset(mpt::Charset::UTF8, jwk));
-					if(json["kty"] != "RSA")
-					{
-						throw std::runtime_error("Cannot parse RSA public key JWK.");
-					}
-					if(json["alg"] != jwk_alg)
-					{
-						throw std::runtime_error("Cannot parse RSA public key JWK.");
-					}
-					if(json["use"] != "sig")
-					{
-						throw std::runtime_error("Cannot parse RSA public key JWK.");
-					}
-					result.name = json["kid"].get<mpt::ustring>();
-					result.public_exp = Util::Base64urlToBin(json["e"]);
-					result.modulus = Util::Base64urlToBin(json["n"]);
-					result.length = mpt::saturate_cast<uint32>(result.modulus.size() * 8);
-				} catch(mpt::out_of_memory e)
-				{
-					mpt::rethrow_out_of_memory(e);
-				} catch(...)
-				{
-					throw std::runtime_error("Cannot parse RSA public key JWK.");
-				}
-				return result;
-			}
-
-			static public_key_data from_cng_blob(const mpt::ustring &name, const std::vector<std::byte> &blob)
-			{
-				public_key_data result;
-				BCRYPT_RSAKEY_BLOB rsakey_blob;
-				Clear(rsakey_blob);
-				if(blob.size() < sizeof(BCRYPT_RSAKEY_BLOB))
-				{
-					throw std::runtime_error("Cannot parse RSA public key blob.");
-				}
-				std::memcpy(&rsakey_blob, blob.data(), sizeof(BCRYPT_RSAKEY_BLOB));
-				if(rsakey_blob.Magic != BCRYPT_RSAPUBLIC_MAGIC)
-				{
-					throw std::runtime_error("Cannot parse RSA public key blob.");
-				}
-				if(blob.size() != sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp + rsakey_blob.cbModulus)
-				{
-					throw std::runtime_error("Cannot parse RSA public key blob.");
-				}
-				result.name = name;
-				result.length = rsakey_blob.BitLength;
-				result.public_exp = std::vector<std::byte>(blob.data() + sizeof(BCRYPT_RSAKEY_BLOB), blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp);
-				result.modulus = std::vector<std::byte>(blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp, blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp + rsakey_blob.cbModulus);
-				return result;
-			}
-		
-		};
-
-
-
-		static std::vector<public_key_data> parse_jwk_set(const mpt::ustring &jwk_set_)
-		{
-			std::vector<public_key_data> result;
-			nlohmann::json jwk_set = nlohmann::json::parse(mpt::ToCharset(mpt::Charset::UTF8, jwk_set_));
-			for(const auto & k : jwk_set["keys"])
-			{
-				try
-				{
-					result.push_back(public_key_data::from_jwk(mpt::ToUnicode(mpt::Charset::UTF8, k.dump())));
-				} catch(...)
-				{
-					// nothing
-				}
-			}
-			return result;
-		}
-
-
-
-		class public_key
-		{
-
-		private:
-			
-			mpt::ustring name;
-			BCRYPT_ALG_HANDLE hSignAlg = NULL;
-			BCRYPT_KEY_HANDLE hKey = NULL;
-		
-		private:
-		
-			void cleanup()
-			{
-				if(hKey)
-				{
-					BCryptDestroyKey(hKey);
-					hKey = NULL;
-				}
-				if(hSignAlg)
-				{
-					BCryptCloseAlgorithmProvider(hSignAlg, 0);
-					hSignAlg = NULL;
-				}
-			}
-
-		public:
-			
-			public_key(const public_key_data &data)
-			{
-				try
-				{
-					name = data.name;
-					CheckNTSTATUS(BCryptOpenAlgorithmProvider(&hSignAlg, BCRYPT_RSA_ALGORITHM, NULL, 0));
-					std::vector<std::byte> blob = data.as_cng_blob();
-					CheckNTSTATUS(BCryptImportKeyPair(hSignAlg, NULL, BCRYPT_RSAPUBLIC_BLOB, &hKey, mpt::byte_cast<UCHAR*>(blob.data()), mpt::saturate_cast<ULONG>(blob.size()), 0));
-				} catch(...)
-				{
-					cleanup();
-					throw;
-				}
-			}
-
-			public_key(const public_key &other)
-				: public_key(other.get_public_key_data())
-			{
-				return;
-			}
-
-			public_key &operator=(const public_key &other)
-			{
-				if(&other == this)
-				{
-					return *this;
-				}
-				public_key copy(other);
-				{
-					using std::swap;
-					swap(copy.name, name);
-					swap(copy.hSignAlg, hSignAlg);
-					swap(copy.hKey, hKey);
-				}
-				return *this;
-			}
-			
-			~public_key()
-			{
-				cleanup();
-			}
-
-			mpt::ustring get_name() const
-			{
-				return name;
-			}
-
-			public_key_data get_public_key_data() const
-			{
-				DWORD bytes = 0;
-				CheckNTSTATUS(BCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, 0, &bytes, 0));
-				std::vector<std::byte> blob(bytes);
-				CheckNTSTATUS(BCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, mpt::byte_cast<BYTE*>(blob.data()), mpt::saturate_cast<DWORD>(blob.size()), &bytes, 0));
-				return public_key_data::from_cng_blob(name, blob);
-			}
-
-			void verify_hash(typename hash_type::result_type hash, std::vector<std::byte> signature)
-			{
-				BCRYPT_PSS_PADDING_INFO paddinginfo;
-				paddinginfo.pszAlgId = hash_type::traits::bcrypt_name;
-				paddinginfo.cbSalt = mpt::saturate_cast<ULONG>(hash_type::traits::output_bytes);
-				NTSTATUS result = BCryptVerifySignature(hKey, &paddinginfo, mpt::byte_cast<UCHAR*>(hash.data()), mpt::saturate_cast<ULONG>(hash.size()), mpt::byte_cast<UCHAR*>(signature.data()), mpt::saturate_cast<ULONG>(signature.size()), BCRYPT_PAD_PSS);
-				if(result == 0x00000000 /*STATUS_SUCCESS*/ )
-				{
-					return;
-				}
-				if(result == 0xC000A000 /*STATUS_INVALID_SIGNATURE*/ )
-				{
-					throw signature_verification_failed();
-				}
-				CheckNTSTATUS(result);
-				throw signature_verification_failed();
-			}
-
-			void verify(mpt::const_byte_span payload, const std::vector<std::byte> &signature)
-			{
-				verify_hash(hash_type().process(payload).result(), signature);
-			}
-
-			std::vector<std::byte> jws_verify(const mpt::ustring &jws_)
-			{
-				nlohmann::json jws = nlohmann::json::parse(mpt::ToCharset(mpt::Charset::UTF8, jws_));
-				std::vector<std::byte> payload = Util::Base64urlToBin(jws["payload"]);
-				nlohmann::json jsignature = nlohmann::json::object();
-				bool sigfound = false;
-				for(const auto & s : jws["signatures"])
-				{
-					if(s["header"]["kid"] == mpt::ToCharset(mpt::Charset::UTF8, name))
-					{
-						jsignature = s;
-						sigfound = true;
-					}
-				}
-				if(!sigfound)
-				{
-					throw signature_verification_failed();
-				}
-				std::vector<std::byte> protectedheaderraw = Util::Base64urlToBin(jsignature["protected"]);
-				std::vector<std::byte> signature = Util::Base64urlToBin(jsignature["signature"]);
-				nlohmann::json header = nlohmann::json::parse(mpt::buffer_cast<std::string>(protectedheaderraw));
-				if(header["typ"] != "JWT")
-				{
-					throw signature_verification_failed();
-				}
-				if(header["alg"] != jwk_alg)
-				{
-					throw signature_verification_failed();
-				}
-				verify_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::ToCharset(mpt::Charset::UTF8, Util::BinToBase64url(mpt::as_span(protectedheaderraw)) + U_(".") + Util::BinToBase64url(mpt::as_span(payload)))))).result(), signature);
-				return payload;
-			}
-
-			std::vector<std::byte> jws_compact_verify(const mpt::ustring &jws)
-			{
-				std::vector<mpt::ustring> parts = mpt::String::Split<mpt::ustring>(jws, U_("."));
-				if(parts.size() != 3)
-				{
-					throw signature_verification_failed();
-				}
-				std::vector<std::byte> protectedheaderraw = Util::Base64urlToBin(parts[0]);
-				std::vector<std::byte> payload = Util::Base64urlToBin(parts[1]);
-				std::vector<std::byte> signature = Util::Base64urlToBin(parts[2]);
-				nlohmann::json header = nlohmann::json::parse(mpt::buffer_cast<std::string>(protectedheaderraw));
-				if(header["typ"] != "JWT")
-				{
-					throw signature_verification_failed();
-				}
-				if(header["alg"] != jwk_alg)
-				{
-					throw signature_verification_failed();
-				}
-				verify_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::ToCharset(mpt::Charset::UTF8, Util::BinToBase64url(mpt::as_span(protectedheaderraw)) + U_(".") + Util::BinToBase64url(mpt::as_span(payload)))))).result(), signature);
-				return payload;
-			}
-
-		};
-
-
-
-		static inline void jws_verify_at_least_one(std::vector<public_key> &keys, const std::vector<std::byte> &expectedPayload, const mpt::ustring &signature)
-		{
-			std::vector<mpt::ustring> keynames = mpt::crypto::asymmetric::jws_get_keynames(signature);
-			bool sigchecked = false;
-			for(const auto & keyname : keynames)
-			{
-				for(auto & key : keys)
-				{
-					if(key.get_name() == keyname)
-					{
-						if(expectedPayload != key.jws_verify(signature))
-						{
-							throw mpt::crypto::asymmetric::signature_verification_failed();
-						}
-						sigchecked = true;
-					}
-				}
-			}
-			if(!sigchecked)
-			{
-				throw mpt::crypto::asymmetric::signature_verification_failed();
-			}
-		}
-
-
-
-		static inline std::vector<std::byte> jws_verify_at_least_one(std::vector<public_key> &keys, const mpt::ustring &signature)
-		{
-			std::vector<mpt::ustring> keynames = mpt::crypto::asymmetric::jws_get_keynames(signature);
-			for(const auto & keyname : keynames)
-			{
-				for(auto & key : keys)
-				{
-					if(key.get_name() == keyname)
-					{
-						return key.jws_verify(signature);
-					}
-				}
-			}
-			throw mpt::crypto::asymmetric::signature_verification_failed();
-		}
-
-
-
-		class managed_private_key
-		{
-
-		private:
-
-			mpt::ustring name;
-			NCRYPT_KEY_HANDLE hKey = NULL;
-		
-		private:
-		
-			void cleanup()
-			{
-				if(hKey)
-				{
-					NCryptFreeObject(hKey);
-					hKey = NULL;
-				}
-			}
-
-		public:
-
-			managed_private_key() = delete;
-
-			managed_private_key(const managed_private_key &) = delete;
-
-			managed_private_key & operator=(const managed_private_key &) = delete;
-
-			managed_private_key(keystore &keystore)
-			{
-				try
-				{
-					CheckSECURITY_STATUS(NCryptCreatePersistedKey(keystore, &hKey, BCRYPT_RSA_ALGORITHM, NULL, 0, 0));
-				} catch(...)
-				{
-					cleanup();
-					throw;
-				}
-			}
-
-			managed_private_key(keystore &keystore, const mpt::ustring &name_)
-				: name(name_)
-			{
-				try
-				{
-					SECURITY_STATUS openKeyStatus = NCryptOpenKey(keystore, &hKey, mpt::ToWide(name).c_str(), 0, (keystore.store_domain() == keystore::domain::system ? NCRYPT_MACHINE_KEY_FLAG : 0));
-					if(openKeyStatus == NTE_BAD_KEYSET)
-					{
-						CheckSECURITY_STATUS(NCryptCreatePersistedKey(keystore, &hKey, BCRYPT_RSA_ALGORITHM, mpt::ToWide(name).c_str(), 0, (keystore.store_domain() == keystore::domain::system ? NCRYPT_MACHINE_KEY_FLAG : 0)));
-						DWORD length = mpt::saturate_cast<DWORD>(keysize);
-						CheckSECURITY_STATUS(NCryptSetProperty(hKey, NCRYPT_LENGTH_PROPERTY, (PBYTE)&length, mpt::saturate_cast<DWORD>(sizeof(DWORD)), 0));
-						CheckSECURITY_STATUS(NCryptFinalizeKey(hKey, 0));
-					} else
-					{
-						CheckSECURITY_STATUS(openKeyStatus);
-					}
-				} catch(...)
-				{
-					cleanup();
-					throw;
-				}
-			}
-
-			~managed_private_key()
-			{
-				cleanup();
-			}
-
-			void destroy()
-			{
-				CheckSECURITY_STATUS(NCryptDeleteKey(hKey, 0));
-				name = mpt::ustring();
-				hKey = NULL;
-			}
-
-		public:
-
-			public_key_data get_public_key_data() const
-			{
-				DWORD bytes = 0;
-				CheckSECURITY_STATUS(NCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, NULL, 0, &bytes, 0));
-				std::vector<std::byte> blob(bytes);
-				CheckSECURITY_STATUS(NCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, mpt::byte_cast<BYTE*>(blob.data()), mpt::saturate_cast<DWORD>(blob.size()), &bytes, 0));
-				return public_key_data::from_cng_blob(name, blob);
-			}
-			
-			std::vector<std::byte> sign_hash(typename hash_type::result_type hash)
-			{
-				BCRYPT_PSS_PADDING_INFO paddinginfo;
-				paddinginfo.pszAlgId = hash_type::traits::bcrypt_name;
-				paddinginfo.cbSalt = mpt::saturate_cast<ULONG>(hash_type::traits::output_bytes);
-				DWORD bytes = 0;
-				CheckSECURITY_STATUS(NCryptSignHash(hKey, &paddinginfo, mpt::byte_cast<BYTE*>(hash.data()), mpt::saturate_cast<DWORD>(hash.size()), NULL, 0, &bytes, BCRYPT_PAD_PSS));
-				std::vector<std::byte> result(bytes);
-				CheckSECURITY_STATUS(NCryptSignHash(hKey, &paddinginfo, mpt::byte_cast<BYTE*>(hash.data()), mpt::saturate_cast<DWORD>(hash.size()), mpt::byte_cast<BYTE*>(result.data()), mpt::saturate_cast<DWORD>(result.size()), &bytes, BCRYPT_PAD_PSS));
-				return result;
-			}
-
-			std::vector<std::byte> sign(mpt::const_byte_span payload)
-			{
-				return sign_hash(hash_type().process(payload).result());
-			}
-
-			mpt::ustring jws_compact_sign(mpt::const_byte_span payload)
-			{
-				nlohmann::json protectedheader = nlohmann::json::object();
-				protectedheader["typ"] = "JWT";
-				protectedheader["alg"] = jwk_alg;
-				std::string protectedheaderstring = protectedheader.dump();
-				std::vector<std::byte> signature = sign_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::ToCharset(mpt::Charset::UTF8, Util::BinToBase64url(mpt::as_span(protectedheaderstring)) + U_(".") + Util::BinToBase64url(payload))))).result());
-				return Util::BinToBase64url(mpt::as_span(protectedheaderstring)) + U_(".") + Util::BinToBase64url(payload) + U_(".") + Util::BinToBase64url(mpt::as_span(signature));
-			}
-
-			mpt::ustring jws_sign(mpt::const_byte_span payload)
-			{
-				nlohmann::json protectedheader = nlohmann::json::object();
-				protectedheader["typ"] = "JWT";
-				protectedheader["alg"] = jwk_alg;
-				std::string protectedheaderstring = protectedheader.dump();
-				nlohmann::json header = nlohmann::json::object();
-				header["kid"] = name;
-				std::vector<std::byte> signature = sign_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::ToCharset(mpt::Charset::UTF8, Util::BinToBase64url(mpt::as_span(protectedheaderstring)) + U_(".") + Util::BinToBase64url(payload))))).result());
-				nlohmann::json jws = nlohmann::json::object();
-				jws["payload"] = Util::BinToBase64url(payload);
-				jws["signatures"] = nlohmann::json::array();
-				nlohmann::json jsignature = nlohmann::json::object();
-				jsignature["header"] = header;
-				jsignature["protected"] = Util::BinToBase64url(mpt::as_span(protectedheaderstring));
-				jsignature["signature"] = Util::BinToBase64url(mpt::as_span(signature));
-				jws["signatures"].push_back(jsignature);
-				return mpt::ToUnicode(mpt::Charset::UTF8, jws.dump());
-			}
-
-		};
-
-	}; // class rsassa_pss
-
-
-
-} // namespace
-
-
-} // namespace cryto
-
-
-#endif // MPT_OS_WINDOWS
-#endif // MODPLUG_TRACKER
-
-
-} // namespace mpt
-
-
-OPENMPT_NAMESPACE_END
+#include "mpt/crypto/hash.hpp"
+#include "mpt/crypto/jwk.hpp"
Index: misc/mptUUIDNamespace.cpp
===================================================================
--- misc/mptUUIDNamespace.cpp	(revision 14628)
+++ misc/mptUUIDNamespace.cpp	(nonexistent)
@@ -1,63 +0,0 @@
-/*
- * mptUUIDNamespace.cpp
- * --------------------
- * Purpose: UUID utility functions.
- * Notes  : (currently none)
- * Authors: OpenMPT Devs
- * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
- */
-
-
-#include "stdafx.h"
-#include "mptUUIDNamespace.h"
-
-#include "../common/mptUUID.h"
-#include "../misc/mptCrypto.h"
-
-
-OPENMPT_NAMESPACE_BEGIN
-
-
-namespace mpt
-{
-
-
-UUID UUIDRFC4122NamespaceV3(const UUID &ns, const mpt::ustring &name)
-{
-	UUIDbin binns = ns;
-	std::vector<std::byte> buf;
-	buf.resize(sizeof(UUIDbin));
-	std::copy(mpt::as_raw_memory(binns).data(), mpt::as_raw_memory(binns).data() + sizeof(UUIDbin), buf.data());
-	std::string utf8name = mpt::ToCharset(mpt::Charset::UTF8, name);
-	buf.resize(buf.size() + utf8name.length());
-	std::transform(utf8name.begin(), utf8name.end(), buf.data() + sizeof(UUIDbin), [](char c){ return mpt::byte_cast<std::byte>(c); });
-	std::array<std::byte, 16> hash = mpt::crypto::hash::MD5().process(mpt::as_span(buf)).result();
-	UUIDbin uuidbin;
-	std::copy(hash.begin(), hash.begin() + 16, mpt::as_raw_memory(uuidbin).data());
-	UUID uuid{uuidbin};
-	uuid.MakeRFC4122(3);
-	return uuid;
-}
-
-UUID UUIDRFC4122NamespaceV5(const UUID &ns, const mpt::ustring &name)
-{
-	UUIDbin binns = ns;
-	std::vector<std::byte> buf;
-	buf.resize(sizeof(UUIDbin));
-	std::copy(mpt::as_raw_memory(binns).data(), mpt::as_raw_memory(binns).data() + sizeof(UUIDbin), buf.data());
-	std::string utf8name = mpt::ToCharset(mpt::Charset::UTF8, name);
-	buf.resize(buf.size() + utf8name.length());
-	std::transform(utf8name.begin(), utf8name.end(), buf.data() + sizeof(UUIDbin), [](char c){ return mpt::byte_cast<std::byte>(c); });
-	std::array<std::byte, 20> hash = mpt::crypto::hash::SHA1().process(mpt::as_span(buf)).result();
-	UUIDbin uuidbin;
-	std::copy(hash.begin(), hash.begin() + 16, mpt::as_raw_memory(uuidbin).data());
-	UUID uuid{uuidbin};
-	uuid.MakeRFC4122(5);
-	return uuid;
-}
-
-
-} // namespace mpt
-
-
-OPENMPT_NAMESPACE_END

Property changes on: misc/mptUUIDNamespace.cpp
___________________________________________________________________
Deleted: svn:eol-style
## -1 +0,0 ##
-native
\ No newline at end of property
Deleted: svn:mime-type
## -1 +0,0 ##
-text/x-c++src
\ No newline at end of property
Index: misc/mptUUIDNamespace.h
===================================================================
--- misc/mptUUIDNamespace.h	(revision 14628)
+++ misc/mptUUIDNamespace.h	(working copy)
@@ -12,21 +12,4 @@
 
 #include "BuildSettings.h"
 
-#include "../common/mptString.h"
-#include "../common/mptUUID.h"
-
-
-OPENMPT_NAMESPACE_BEGIN
-
-
-namespace mpt {
-
-// Create a RFC4122 Version 3 namespace UUID
-UUID UUIDRFC4122NamespaceV3(const UUID &ns, const mpt::ustring &name);
-// Create a RFC4122 Version 5 namespace UUID
-UUID UUIDRFC4122NamespaceV5(const UUID &ns, const mpt::ustring &name);
-
-} // namespace mpt
-
-
-OPENMPT_NAMESPACE_END
+#include "mpt/uuid_namespace/uuid_namespace.hpp"
Index: mptrack/HTTP.cpp
===================================================================
--- mptrack/HTTP.cpp	(revision 14628)
+++ mptrack/HTTP.cpp	(working copy)
@@ -117,7 +117,7 @@
 {
 public:
 	LastErrorException()
-		: exception(mpt::Windows::GetErrorMessage(GetLastError(), GetModuleHandle(TEXT("wininet.dll"))))
+		: exception(mpt::windows::GetErrorMessage(GetLastError(), GetModuleHandle(TEXT("wininet.dll"))))
 	{
 	}
 };
Index: mptrack/Mod2wave.cpp
===================================================================
--- mptrack/Mod2wave.cpp	(revision 14628)
+++ mptrack/Mod2wave.cpp	(working copy)
@@ -1215,7 +1215,7 @@
 				MPT_ASSERT(!mpt::endian_is_weird());
 				if(fileEnc->GetConvertedEndianness() != mpt::get_endian())
 				{
-					mpt::SwapBufferEndian(m_Settings.FinalSampleFormat.GetSampleSize(), buffer, lRead * encSettings.Channels);
+					SwapBufferEndian(m_Settings.FinalSampleFormat.GetSampleSize(), buffer, lRead * encSettings.Channels);
 				}
 				fileEnc->WriteInterleavedConverted(lRead, buffer);
 			}
@@ -1359,7 +1359,7 @@
 				MPT_ASSERT(!mpt::endian_is_weird());
 				if(fileEnc->GetConvertedEndianness() != mpt::get_endian())
 				{
-					mpt::SwapBufferEndian(m_Settings.FinalSampleFormat.GetSampleSize(), buffer, framesChunk * channels);
+					SwapBufferEndian(m_Settings.FinalSampleFormat.GetSampleSize(), buffer, framesChunk * channels);
 				}
 				fileEnc->WriteInterleavedConverted(framesChunk, buffer);
 			}
Index: mptrack/Mptrack.cpp
===================================================================
--- mptrack/Mptrack.cpp	(revision 14628)
+++ mptrack/Mptrack.cpp	(working copy)
@@ -834,7 +834,7 @@
 	// make the best PRNG available to non-tracker-only code
 	mpt::set_global_prng(m_PRNG.get());
 	// additionally, seed the C rand() PRNG, just in case any third party library calls rand()
-	mpt::rng::crand::reseed(RandomDevice());
+	mpt::crand::reseed(RandomDevice());
 
 	m_Gdiplus = std::make_unique<GdiplusRAII>();
 
Index: mptrack/MPTrackWine.cpp
===================================================================
--- mptrack/MPTrackWine.cpp	(revision 14628)
+++ mptrack/MPTrackWine.cpp	(working copy)
@@ -92,7 +92,7 @@
 namespace WineIntegration {
 
 
-static mpt::checksum::crc64_jones WineHashVersion(mpt::checksum::crc64_jones crc)
+static mpt::crc64_jones WineHashVersion(mpt::crc64_jones crc)
 {
 	std::string s;
 	s += mpt::ToCharset(mpt::Charset::UTF8, Build::GetVersionStringExtended());
@@ -105,7 +105,7 @@
 }
 
 
-static mpt::checksum::crc64_jones WineHashFile(mpt::checksum::crc64_jones crc, mpt::PathString filename)
+static mpt::crc64_jones WineHashFile(mpt::crc64_jones crc, mpt::PathString filename)
 {
 	InputFile file(filename, TrackerSettings::Instance().MiscCacheCompleteFileBeforeLoading);
 	if(!file.IsValid())
@@ -119,7 +119,7 @@
 }
 
 
-static mpt::checksum::crc64_jones WineHashSettings(mpt::checksum::crc64_jones crc)
+static mpt::crc64_jones WineHashSettings(mpt::crc64_jones crc)
 {
 	std::string result;
 	result += std::string() + "-c";
@@ -318,7 +318,7 @@
 			{
 				std::string ver;
 				ver += mpt::String::Replace(mpt::ToCharset(mpt::Charset::UTF8, Build::GetVersionStringPure()), std::string(" "), std::string("_"));
-				mpt::checksum::crc64_jones crc;
+				mpt::crc64_jones crc;
 				crc = WineHashVersion(crc);
 				crc = WineHashFile(crc, theApp.GetInstallPath() + WineGetSupportZipFilename());
 				crc = WineHashSettings(crc);
Index: mptrack/TrackerSettings.cpp
===================================================================
--- mptrack/TrackerSettings.cpp	(revision 14628)
+++ mptrack/TrackerSettings.cpp	(working copy)
@@ -13,6 +13,7 @@
 #include "Mptrack.h"
 #include "Moddoc.h"
 #include "Mainfrm.h"
+#include "mpt/environment/environment.hpp"
 #include "../sounddev/SoundDevice.h"
 #include "../sounddev/SoundDeviceManager.h"
 #include "../common/version.h"
@@ -471,7 +472,7 @@
 	if(!VersionInstallGUID.Get().IsValid())
 	{
 		// No UUID found - generate one.
-		VersionInstallGUID = mpt::UUID::Generate();
+		VersionInstallGUID = mpt::UUID::Generate(mpt::global_prng());
 	}
 
 	// Plugins
Index: mptrack/UpdateCheck.cpp
===================================================================
--- mptrack/UpdateCheck.cpp	(revision 14628)
+++ mptrack/UpdateCheck.cpp	(working copy)
@@ -1595,7 +1595,7 @@
 
 CString CUpdateCheck::Error::FormatErrorCode(CString errorMessage, DWORD errorCode)
 {
-	errorMessage += mpt::ToCString(mpt::Windows::GetErrorMessage(errorCode, GetModuleHandle(TEXT("wininet.dll"))));
+	errorMessage += mpt::ToCString(mpt::windows::GetErrorMessage(errorCode, GetModuleHandle(TEXT("wininet.dll"))));
 	return errorMessage;
 }
 
Index: mptrack/Vstplug.cpp
===================================================================
--- mptrack/Vstplug.cpp	(revision 14628)
+++ mptrack/Vstplug.cpp	(working copy)
@@ -172,7 +172,7 @@
 #ifdef _DEBUG
 		mpt::ustring buf = MPT_UFORMAT("Warning: encountered problem when loading plugin dll. Error {}: {}")
 			( mpt::ufmt::hex(error)
-			, mpt::ToUnicode(mpt::Windows::GetErrorMessage(error))
+			, mpt::ToUnicode(mpt::windows::GetErrorMessage(error))
 			);
 		Reporting::Error(buf, "DEBUG: Error when loading plugin dll");
 #endif //_DEBUG
Index: openmpt123/openmpt123.cpp
===================================================================
--- openmpt123/openmpt123.cpp	(revision 14628)
+++ openmpt123/openmpt123.cpp	(working copy)
@@ -1601,7 +1601,7 @@
 				// Only MSVC has std::ifstream::ifstream(std::wstring).
 				// Fake it for other compilers using _wfopen().
 				std::string data;
-				FILE * f = _wfopen( utf8_to_wstring( filename ).c_str(), L"rb" );
+				FILE * f = _wfopen( mpt::convert<std::wstring>( mpt::common_encoding::utf8, filename ).c_str(), L"rb" );
 				if ( f ) {
 					while ( !feof( f ) ) {
 						static const std::size_t BUFFER_SIZE = 4096;
@@ -1615,7 +1615,7 @@
 				file_stream.str( data );
 				filesize = data.length();
 			#elif defined(_MSC_VER) && defined(UNICODE)
-				file_stream.open( utf8_to_wstring( filename ), std::ios::binary );
+				file_stream.open( mpt::convert<std::wstring>( mpt::common_encoding::utf8, filename ), std::ios::binary );
 				file_stream.seekg( 0, std::ios::end );
 				filesize = file_stream.tellg();
 				file_stream.seekg( 0, std::ios::beg );
@@ -1677,7 +1677,7 @@
 				// Only MSVC has std::ifstream::ifstream(std::wstring).
 				// Fake it for other compilers using _wfopen().
 				std::string data;
-				FILE * f = _wfopen( utf8_to_wstring( filename ).c_str(), L"rb" );
+				FILE * f = _wfopen( mpt::convert<std::wstring>( mpt::common_encoding::utf8, filename ).c_str(), L"rb" );
 				if ( f ) {
 					while ( !feof( f ) ) {
 						static const std::size_t BUFFER_SIZE = 4096;
@@ -1691,7 +1691,7 @@
 				file_stream.str( data );
 				filesize = data.length();
 			#elif defined(_MSC_VER) && defined(UNICODE)
-				file_stream.open( utf8_to_wstring( filename ), std::ios::binary );
+				file_stream.open( mpt::convert<std::wstring>( mpt::common_encoding::utf8, filename ), std::ios::binary );
 				file_stream.seekg( 0, std::ios::end );
 				filesize = file_stream.tellg();
 				file_stream.seekg( 0, std::ios::beg );
@@ -1844,7 +1844,7 @@
 			// Only MSVC has std::ifstream::ifstream(std::wstring).
 			// Fake it for other compilers using _wfopen().
 			std::string data;
-			FILE * f = _wfopen( utf8_to_wstring( filename ).c_str(), L"rb" );
+			FILE * f = _wfopen( mpt::convert<std::wstring>( mpt::common_encoding::utf8, filename ).c_str(), L"rb" );
 			if ( f ) {
 				while ( !feof( f ) ) {
 					static const std::size_t BUFFER_SIZE = 4096;
@@ -1857,7 +1857,7 @@
 			}
 			file_stream.str( data );
 		#elif defined(_MSC_VER) && defined(UNICODE)
-			file_stream.open( utf8_to_wstring( filename ), std::ios::binary );
+			file_stream.open( mpt::convert<std::wstring>( mpt::common_encoding::utf8, filename ), std::ios::binary );
 		#else
 			file_stream.open( filename, std::ios::binary );
 		#endif
@@ -1906,7 +1906,7 @@
 					newfile = line;
 				} else {
 #if defined(WIN32)
-					newfile = wstring_to_utf8( locale_to_wstring( line ) );
+					newfile = mpt::convert<std::string>( mpt::common_encoding::utf8, mpt::logical_encoding::locale, line );
 #else
 					newfile = line;
 #endif
@@ -1916,7 +1916,7 @@
 					newfile = line;
 				} else {
 #if defined(WIN32)
-					newfile = wstring_to_utf8( locale_to_wstring( line ) );
+					newfile = mpt::convert<std::string>( mpt::common_encoding::utf8, mpt::logical_encoding::locale, line );
 #else
 					newfile = line;
 #endif
@@ -2279,7 +2279,7 @@
 	std::vector<std::string> args;
 	#if defined(WIN32) && defined(UNICODE)
 		for ( int arg = 0; arg < wargc; ++arg ) {
-			args.push_back( wstring_to_utf8( wargv[arg] ) );
+			args.push_back( mpt::convert<std::string>( mpt::common_encoding::utf8, wargv[arg] ) );
 		}
 	#else
 		args = std::vector<std::string>( argv, argv + argc );
Index: openmpt123/openmpt123.hpp
===================================================================
--- openmpt123/openmpt123.hpp	(revision 14628)
+++ openmpt123/openmpt123.hpp	(working copy)
@@ -12,6 +12,12 @@
 
 #include "openmpt123_config.hpp"
 
+#include "mpt/base/compiletime_warning.hpp"
+#include "mpt/base/preprocessor.hpp"
+#include "mpt/string/convert.hpp"
+
+#include <string>
+
 namespace openmpt123 {
 
 struct exception : public openmpt::exception {
@@ -37,660 +43,6 @@
 
 
 
-#if defined(WIN32)
-
-
-
-static inline std::string wstring_to_utf8( const std::wstring & unicode_string ) {
-	std::string utf8_string;
-	int source_length = ( unicode_string.size() < static_cast<unsigned int>( std::numeric_limits<int>::max() ) ) ? static_cast<int>( unicode_string.size() ) : std::numeric_limits<int>::max();
-	int required_size = WideCharToMultiByte( CP_UTF8, 0, unicode_string.data(), source_length, NULL, 0, NULL, NULL );
-	if ( required_size > 0 ) {
-		utf8_string.resize( required_size );
-		WideCharToMultiByte( CP_UTF8, 0, unicode_string.data(), source_length, utf8_string.data(), required_size, NULL, NULL );
-	}
-	return utf8_string;
-}
-
-static inline std::wstring utf8_to_wstring( const std::string & utf8_string ) {
-	std::wstring unicode_string;
-	int source_length = ( utf8_string.size() < static_cast<unsigned int>( std::numeric_limits<int>::max() ) ) ? static_cast<int>( utf8_string.size() ) : std::numeric_limits<int>::max();
-	int required_size = MultiByteToWideChar( CP_UTF8, 0, utf8_string.data(), source_length, NULL, 0 );
-	if ( required_size > 0 ) {
-		unicode_string.resize( required_size );
-		MultiByteToWideChar( CP_UTF8, 0, utf8_string.data(), source_length, unicode_string.data(), required_size );
-	}
-	return unicode_string;
-}
-
-static inline std::string wstring_to_locale( const std::wstring & unicode_string ) {
-	std::string locale_string;
-	int source_length = ( unicode_string.size() < static_cast<unsigned int>( std::numeric_limits<int>::max() ) ) ? static_cast<int>( unicode_string.size() ) : std::numeric_limits<int>::max();
-	int required_size = WideCharToMultiByte( CP_ACP, 0, unicode_string.data(), source_length, NULL, 0, NULL, NULL );
-	if ( required_size > 0 ) {
-		locale_string.resize( required_size );
-		WideCharToMultiByte( CP_ACP, 0, unicode_string.data(), source_length, locale_string.data(), required_size, NULL, NULL );
-	}
-	return locale_string;
-}
-
-static inline std::wstring locale_to_wstring( const std::string & locale_string ) {
-	std::wstring unicode_string;
-	int source_length = ( locale_string.size() < static_cast<unsigned int>( std::numeric_limits<int>::max() ) ) ? static_cast<int>( locale_string.size() ) : std::numeric_limits<int>::max();
-	int required_size = MultiByteToWideChar( CP_ACP, 0, locale_string.data(), source_length, NULL, 0 );
-	if ( required_size > 0 ) {
-		unicode_string.resize( required_size );
-		MultiByteToWideChar( CP_ACP, 0, locale_string.data(), source_length, unicode_string.data(), required_size );
-	}
-	return unicode_string;
-}
-
-
-
-#endif
-
-
-
-/*
-default 1:1 mapping
-static constexpr char32_t CharsetTableISO8859_1[256] = {
-	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
-	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
-	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
-	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
-	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
-	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
-	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
-	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
-	0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f,
-	0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f,
-	0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
-	0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf,
-	0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
-	0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
-	0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
-	0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
-};
-*/
-
-static constexpr char32_t CharsetTableISO8859_15[256] = {
-	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
-	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
-	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
-	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
-	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
-	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
-	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
-	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
-	0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f,
-	0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f,
-	0x00a0,0x00a1,0x00a2,0x00a3,0x20ac,0x00a5,0x0160,0x00a7,0x0161,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
-	0x00b0,0x00b1,0x00b2,0x00b3,0x017d,0x00b5,0x00b6,0x00b7,0x017e,0x00b9,0x00ba,0x00bb,0x0152,0x0153,0x0178,0x00bf,
-	0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
-	0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
-	0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
-	0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
-};
-
-static constexpr char32_t CharsetTableWindows1252[256] = {
-	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
-	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
-	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
-	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
-	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
-	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
-	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
-	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
-	0x20ac,0x0081,0x201a,0x0192,0x201e,0x2026,0x2020,0x2021,0x02c6,0x2030,0x0160,0x2039,0x0152,0x008d,0x017d,0x008f,
-	0x0090,0x2018,0x2019,0x201c,0x201d,0x2022,0x2013,0x2014,0x02dc,0x2122,0x0161,0x203a,0x0153,0x009d,0x017e,0x0178,
-	0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
-	0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf,
-	0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
-	0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
-	0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
-	0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
-};
-
-static constexpr char32_t CharsetTableCP437[256] = {
-	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
-	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
-	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
-	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
-	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
-	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
-	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
-	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x2302,
-	0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7,0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5,
-	0x00c9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9,0x00ff,0x00d6,0x00dc,0x00a2,0x00a3,0x00a5,0x20a7,0x0192,
-	0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba,0x00bf,0x2310,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb,
-	0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556,0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510,
-	0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f,0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567,
-	0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b,0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580,
-	0x03b1,0x00df,0x0393,0x03c0,0x03a3,0x03c3,0x00b5,0x03c4,0x03a6,0x0398,0x03a9,0x03b4,0x221e,0x03c6,0x03b5,0x2229,
-	0x2261,0x00b1,0x2265,0x2264,0x2320,0x2321,0x00f7,0x2248,0x00b0,0x2219,0x00b7,0x221a,0x207f,0x00b2,0x25a0,0x00a0
-};
-
-static constexpr char32_t CharsetTableCP850[256] = {
-	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
-	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
-	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
-	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
-	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
-	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
-	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
-	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x2302,
-	0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7,0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5,
-	0x00c9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9,0x00ff,0x00d6,0x00dc,0x00F8,0x00a3,0x00D8,0x00D7,0x0192,
-	0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba,0x00bf,0x00AE,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb,
-	0x2591,0x2592,0x2593,0x2502,0x2524,0x00C1,0x00C2,0x00C0,0x00A9,0x2563,0x2551,0x2557,0x255d,0x00A2,0x00A5,0x2510,
-	0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x00E3,0x00C3,0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x00A4,
-	0x00F0,0x00D0,0x00CA,0x00CB,0x00C8,0x0131,0x00CD,0x00CE,0x00CF,0x2518,0x250c,0x2588,0x2584,0x00A6,0x00CC,0x2580,
-	0x00D3,0x00df,0x00D4,0x00D2,0x00F5,0x00D5,0x00b5,0x00FE,0x00DE,0x00DA,0x00DB,0x00D9,0x00FD,0x00DD,0x00AF,0x00B4,
-	0x00AD,0x00b1,0x2017,0x00BE,0x00B6,0x00A7,0x00f7,0x00B8,0x00b0,0x00A8,0x00b7,0x00B9,0x00B3,0x00b2,0x25a0,0x00a0
-};
-
-
-#if defined(__DJGPP__)
-using widechar = char32_t;
-using widestring = std::u32string;
-static constexpr widechar wide_default_replacement = 0xFFFD;
-#else // !__DJGPP__
-using widechar = wchar_t;
-using widestring = std::wstring;
-static constexpr widechar wide_default_replacement = L'\uFFFD';
-#endif // !__DJGPP__
-
-
-static inline widestring From8bit(const std::string &str, const char32_t (&table)[256], widechar replacement = wide_default_replacement)
-{
-	widestring res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		std::size_t c = static_cast<std::size_t>(static_cast<std::uint8_t>(str[i]));
-		if(c < std::size(table))
-		{
-			res.push_back(static_cast<widechar>(table[c]));
-		} else
-		{
-			res.push_back(replacement);
-		}
-	}
-	return res;
-}
-
-static inline std::string To8bit(const widestring &str, const char32_t (&table)[256], char replacement = '?')
-{
-	std::string res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		char32_t c = static_cast<char32_t>(str[i]);
-		bool found = false;
-		// Try non-control characters first.
-		// In cases where there are actual characters mirrored in this range (like in AMS/AMS2 character sets),
-		// characters in the common range are preferred this way.
-		for(std::size_t x = 0x20; x < std::size(table); ++x)
-		{
-			if(c == table[x])
-			{
-				res.push_back(static_cast<char>(static_cast<std::uint8_t>(x)));
-				found = true;
-				break;
-			}
-		}
-		if(!found)
-		{
-			// try control characters
-			for(std::size_t x = 0x00; x < std::size(table) && x < 0x20; ++x)
-			{
-				if(c == table[x])
-				{
-					res.push_back(static_cast<char>(static_cast<std::uint8_t>(x)));
-					found = true;
-					break;
-				}
-			}
-		}
-		if(!found)
-		{
-			res.push_back(replacement);
-		}
-	}
-	return res;
-}
-
-static inline widestring FromAscii(const std::string &str, widechar replacement = wide_default_replacement)
-{
-	widestring res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		std::uint8_t c = str[i];
-		if(c <= 0x7f)
-		{
-			res.push_back(static_cast<widechar>(static_cast<std::uint32_t>(c)));
-		} else
-		{
-			res.push_back(replacement);
-		}
-	}
-	return res;
-}
-
-static inline std::string ToAscii(const widestring &str, char replacement = '?')
-{
-	std::string res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		char32_t c = static_cast<char32_t>(str[i]);
-		if(c <= 0x7f)
-		{
-			res.push_back(static_cast<char>(static_cast<std::uint8_t>(c)));
-		} else
-		{
-			res.push_back(replacement);
-		}
-	}
-	return res;
-}
-
-static inline widestring FromISO_8859_1(const std::string &str, widechar replacement = wide_default_replacement)
-{
-	static_cast<void>( replacement );
-	widestring res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		std::uint8_t c = str[i];
-		res.push_back(static_cast<widechar>(static_cast<std::uint32_t>(c)));
-	}
-	return res;
-}
-
-static inline std::string ToISO_8859_1(const widestring &str, char replacement = '?')
-{
-	std::string res;
-	res.reserve(str.length());
-	for(std::size_t i = 0; i < str.length(); ++i)
-	{
-		char32_t c = static_cast<char32_t>(str[i]);
-		if(c <= 0xff)
-		{
-			res.push_back(static_cast<char>(static_cast<std::uint8_t>(c)));
-		} else
-		{
-			res.push_back(replacement);
-		}
-	}
-	return res;
-}
-
-
-#if !defined(__DJGPP__) && !defined(__EMSCRIPTEN__)
-
-// Note:
-//
-//  std::codecvt::out in LLVM libc++ does not advance in and out pointers when
-// running into a non-convertible character. This can happen when no locale is
-// set on FreeBSD or MacOSX. This behaviour violates the C++ standard.
-//
-//  We apply the following (albeit costly, even on other platforms) work-around:
-//  If the conversion errors out and does not advance the pointers at all, we
-// retry the conversion with a space character prepended to the string. If it
-// still does error out, we retry the whole conversion character by character.
-//  This is costly even on other platforms in one single case: The first
-// character is an invalid Unicode code point or otherwise not convertible. Any
-// following non-convertible characters are not a problem.
-
-static inline std::wstring LocaleDecode(const std::string &str, const std::locale & locale, wchar_t replacement = L'\uFFFD', int retry = 0, bool * progress = nullptr)
-{
-	if(str.empty())
-	{
-		return std::wstring();
-	}
-	std::vector<wchar_t> out;
-	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
-	std::mbstate_t state = std::mbstate_t();
-	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
-	codecvt_type::result result = codecvt_type::partial;
-	const char * in_begin = str.data();
-	const char * in_end = in_begin + str.size();
-	out.resize((in_end - in_begin) * (facet.max_length() + std::size_t{1}));
-	wchar_t * out_begin = &(out[0]);
-	wchar_t * out_end = &(out[0]) + out.size();
-	const char * in_next = nullptr;
-	wchar_t * out_next = nullptr;
-	do
-	{
-		if(retry == 2)
-		{
-			for(;;)
-			{
-				in_next = nullptr;
-				out_next = nullptr;
-				result = facet.in(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
-				if(result == codecvt_type::partial && in_next == in_begin + 1)
-				{
-					in_begin = in_next;
-					out_begin = out_next;
-					continue;
-				} else
-				{
-					break;
-				}
-			}
-		} else
-		{
-			in_next = nullptr;
-			out_next = nullptr;
-			result = facet.in(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
-		}
-		if(result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end))
-		{
-			out.resize(out.size() * 2);
-			in_begin = in_next;
-			out_begin = &(out[0]) + (out_next - out_begin);
-			out_end = &(out[0]) + out.size();
-			continue;
-		}
-		if(retry == 0)
-		{
-			if(result == codecvt_type::error && in_next == in_begin && out_next == out_begin)
-			{
-				bool made_progress = true;
-				LocaleDecode(std::string(" ") + str, locale, replacement, 1, &made_progress);
-				if(!made_progress)
-				{
-					return LocaleDecode(str, locale, replacement, 2);
-				}
-			}
-		} else if(retry == 1)
-		{
-			if(result == codecvt_type::error && in_next == in_begin && out_next == out_begin)
-			{
-				*progress = false;
-			} else
-			{
-				*progress = true;
-			}
-			return std::wstring();
-		}
-		if(result == codecvt_type::error)
-		{
-			++in_next;
-			*out_next = replacement;
-			++out_next;
-		}
-		in_begin = in_next;
-		out_begin = out_next;
-	} while((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
-	return std::wstring(&(out[0]), out_next);
-}
-
-static inline std::string LocaleEncode(const std::wstring &str, const std::locale & locale, char replacement = '?', int retry = 0, bool * progress = nullptr)
-{
-	if(str.empty())
-	{
-		return std::string();
-	}
-	std::vector<char> out;
-	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
-	std::mbstate_t state = std::mbstate_t();
-	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
-	codecvt_type::result result = codecvt_type::partial;
-	const wchar_t * in_begin = str.data();
-	const wchar_t * in_end = in_begin + str.size();
-	out.resize((in_end - in_begin) * (facet.max_length() + std::size_t{1}));
-	char * out_begin = &(out[0]);
-	char * out_end = &(out[0]) + out.size();
-	const wchar_t * in_next = nullptr;
-	char * out_next = nullptr;
-	do
-	{
-		if(retry == 2)
-		{
-			for(;;)
-			{
-				in_next = nullptr;
-				out_next = nullptr;
-				result = facet.out(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
-				if(result == codecvt_type::partial && in_next == in_begin + 1)
-				{
-					in_begin = in_next;
-					out_begin = out_next;
-					continue;
-				} else
-				{
-					break;
-				}
-			}
-		} else
-		{
-			in_next = nullptr;
-			out_next = nullptr;
-			result = facet.out(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
-		}
-		if(result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end))
-		{
-			out.resize(out.size() * 2);
-			in_begin = in_next;
-			out_begin = &(out[0]) + (out_next - out_begin);
-			out_end = &(out[0]) + out.size();
-			continue;
-		}
-		if(retry == 0)
-		{
-			if(result == codecvt_type::error && in_next == in_begin && out_next == out_begin)
-			{
-				bool made_progress = true;
-				LocaleEncode(std::wstring(L" ") + str, locale, replacement, 1, &made_progress);
-				if(!made_progress)
-				{
-					return LocaleEncode(str, locale, replacement, 2);
-				}
-			}
-		} else if(retry == 1)
-		{
-			if(result == codecvt_type::error && in_next == in_begin && out_next == out_begin)
-			{
-				*progress = false;
-			} else
-			{
-				*progress = true;
-			}
-			return std::string();
-		}
-		if(result == codecvt_type::error)
-		{
-			++in_next;
-			*out_next = replacement;
-			++out_next;
-		}
-		in_begin = in_next;
-		out_begin = out_next;
-	} while((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
-	return std::string(&(out[0]), out_next);
-}
-
-
-static inline std::wstring FromLocale(const std::string &str, wchar_t replacement = L'\uFFFD')
-{
-	return LocaleDecode(str, std::locale(""), replacement);
-}
-
-static inline std::string ToLocale(const std::wstring &str, char replacement = '?')
-{
-	return LocaleEncode(str, std::locale(""), replacement);
-}
-
-
-
-#endif // !__DJGPP__ && !__EMSCRIPTEN
-
-
-
-static inline widestring FromUTF8(const std::string &str, widechar replacement = wide_default_replacement)
-{
-	const std::string &in = str;
-
-	widestring out;
-
-	// state:
-	std::size_t charsleft = 0;
-	char32_t ucs4 = 0;
-
-	for ( std::uint8_t c : in ) {
-
-		if ( charsleft == 0 ) {
-
-			if ( ( c & 0x80 ) == 0x00 ) {
-				out.push_back( (wchar_t)c );
-			} else if ( ( c & 0xE0 ) == 0xC0 ) {
-				ucs4 = c & 0x1F;
-				charsleft = 1;
-			} else if ( ( c & 0xF0 ) == 0xE0 ) {
-				ucs4 = c & 0x0F;
-				charsleft = 2;
-			} else if ( ( c & 0xF8 ) == 0xF0 ) {
-				ucs4 = c & 0x07;
-				charsleft = 3;
-			} else {
-				out.push_back( replacement );
-				ucs4 = 0;
-				charsleft = 0;
-			}
-
-		} else {
-
-			if ( ( c & 0xC0 ) != 0x80 ) {
-				out.push_back( replacement );
-				ucs4 = 0;
-				charsleft = 0;
-			}
-			ucs4 <<= 6;
-			ucs4 |= c & 0x3F;
-			charsleft--;
-
-			if ( charsleft == 0 ) {
-				if constexpr ( sizeof( widechar ) == 2 ) {
-					if ( ucs4 > 0x1fffff ) {
-						out.push_back( replacement );
-						ucs4 = 0;
-						charsleft = 0;
-					}
-					if ( ucs4 <= 0xffff ) {
-						out.push_back( static_cast<widechar>(ucs4) );
-					} else {
-						std::uint32_t surrogate = static_cast<std::uint32_t>(ucs4) - 0x10000;
-						std::uint16_t hi_sur = static_cast<std::uint16_t>( ( 0x36 << 10 ) | ( (surrogate>>10) & ((1<<10)-1) ) );
-						std::uint16_t lo_sur = static_cast<std::uint16_t>( ( 0x37 << 10 ) | ( (surrogate>> 0) & ((1<<10)-1) ) );
-						out.push_back( hi_sur );
-						out.push_back( lo_sur );
-					}
-				} else {
-					out.push_back( static_cast<widechar>( ucs4 ) );
-				}
-				ucs4 = 0;
-			}
-
-		}
-
-	}
-
-	if ( charsleft != 0 ) {
-		out.push_back( replacement );
-		ucs4 = 0;
-		charsleft = 0;
-	}
-
-	return out;
-
-}
-
-static inline std::string ToUTF8(const widestring &str, char replacement = '?')
-{
-	const widestring &in = str;
-
-	std::string out;
-
-	for ( std::size_t i=0; i<in.length(); i++ ) {
-
-		wchar_t wc = in[i];
-
-		char32_t ucs4 = 0;
-		if constexpr ( sizeof( widechar ) == 2 ) {
-			std::uint16_t c = static_cast<std::uint16_t>( wc );
-			if ( i + 1 < in.length() ) {
-				// check for surrogate pair
-				std::uint16_t hi_sur = in[i+0];
-				std::uint16_t lo_sur = in[i+1];
-				if ( hi_sur >> 10 == 0x36 && lo_sur >> 10 == 0x37 ) {
-					// surrogate pair
-					++i;
-					hi_sur &= (1<<10)-1;
-					lo_sur &= (1<<10)-1;
-					ucs4 = ( static_cast<std::uint32_t>(hi_sur) << 10 ) | ( static_cast<std::uint32_t>(lo_sur) << 0 );
-				} else {
-					// no surrogate pair
-					ucs4 = static_cast<char32_t>( c );
-				}
-			} else {
-				// no surrogate possible
-				ucs4 = static_cast<char32_t>( c );
-			}
-		} else {
-			ucs4 = static_cast<char32_t>( wc );
-		}
-		
-		if ( ucs4 > 0x1fffff ) {
-			out.push_back( replacement );
-			continue;
-		}
-
-		std::uint8_t utf8[6];
-		std::size_t numchars = 0;
-		for ( numchars = 0; numchars < 6; numchars++ ) {
-			utf8[numchars] = ucs4 & 0x3F;
-			ucs4 >>= 6;
-			if ( ucs4 == 0 ) {
-				break;
-			}
-		}
-		numchars++;
-
-		if ( numchars == 1 ) {
-			out.push_back( utf8[0] );
-			continue;
-		}
-
-		if ( numchars == 2 && utf8[numchars-1] == 0x01 ) {
-			// generate shortest form
-			out.push_back( utf8[0] | 0x40 );
-			continue;
-		}
-
-		std::size_t charsleft = numchars;
-		while ( charsleft > 0 ) {
-			if ( charsleft == numchars ) {
-				out.push_back( utf8[ charsleft - 1 ] | ( ((1<<numchars)-1) << (8-numchars) ) );
-			} else {
-				// cppcheck false-positive
-				// cppcheck-suppress arrayIndexOutOfBounds
-				out.push_back( utf8[ charsleft - 1 ] | 0x80 );
-			}
-			charsleft--;
-		}
-
-	}
-
-	return out;
-
-}
-
-
-
 struct field {
 	std::string key;
 	std::string val;
@@ -740,28 +92,17 @@
 private:
 	std::ostream & s;
 #if defined(__DJGPP__)
-	std::uint16_t active_codepage;
-	std::uint16_t system_codepage;
+	mpt::common_encoding codepage;
 #endif
 public:
 	textout_ostream( std::ostream & s_ )
 		: s(s_)
 #if defined(__DJGPP__)
-		, active_codepage(437)
-		, system_codepage(437)
+		, codepage(437)
 #endif
 	{
 		#if defined(__DJGPP__)
-			__dpmi_regs regs;
-			std::memset( &regs, 0, sizeof( __dpmi_regs ) );
-			regs.x.ax = 0x6601;
-			if ( __dpmi_int( 0x21, &regs ) == 0 ) {
-				int cf = ( regs.x.flags >> 0 ) & 1;
-				if ( cf == 0 ) {
-					active_codepage = regs.x.bx;
-					system_codepage = regs.x.dx;
-				}
-			}
+			codepage = mpt::djgpp_get_locale_encoding();
 		#endif
 		return;
 	}
@@ -773,26 +114,12 @@
 		std::string text = pop();
 		if ( text.length() > 0 ) {
 			#if defined(__DJGPP__)
-				if ( active_codepage == 0 ) {
-					s << To8bit( FromUTF8( text ), CharsetTableCP437 );
-				} else if ( active_codepage == 437 ) {
-					s << To8bit( FromUTF8( text ), CharsetTableCP437 );
-				} else if ( active_codepage == 850 ) {
-					s << To8bit( FromUTF8( text ), CharsetTableCP850 );
-				} else if ( system_codepage == 437 ) {
-					s << To8bit( FromUTF8( text ), CharsetTableCP437 );
-				} else if ( system_codepage == 850 ) {
-					s << To8bit( FromUTF8( text ), CharsetTableCP850 );
-				} else {
-					s << To8bit( FromUTF8( text ), CharsetTableCP437 );
-				}
+				s << mpt::convert<std::string>( codepage, mpt::common_encoding::utf8, text );
 			#elif defined(__EMSCRIPTEN__)
 				s << text;
-			#elif defined(WIN32)
-				s << ToLocale( FromUTF8( text ) );
 			#else
-				s << ToLocale( FromUTF8( text ) );
-			#endif
+				s << mpt::convert<std::string>( mpt::logical_encoding::locale, mpt::common_encoding::utf8, text );
+		#endif
 			s.flush();
 		}	
 	}
@@ -840,17 +167,17 @@
 		if ( text.length() > 0 ) {
 			if ( console ) {
 				#if defined(UNICODE)
-					std::wstring wtext = utf8_to_wstring( text );
+					std::wstring wtext = mpt::convert<std::wstring>( mpt::common_encoding::utf8, text );
 					WriteConsole( handle, wtext.data(), static_cast<DWORD>( wtext.size() ), NULL, NULL );
 				#else
-					std::string ltext = wstring_to_locale( utf8_to_wstring( text ) );
+					std::string ltext = mpt::convert<std::string>( mpt::logical_encoding::locale, mpt::common_encoding::utf8, text );
 					WriteConsole( handle, ltext.data(), static_cast<DWORD>( ltext.size() ), NULL, NULL );
 				#endif
 			} else {
 				#if defined(UNICODE)
-					s << utf8_to_wstring( text );
+					s << mpt::convert<std::wstring>( mpt::common_encoding::utf8, text );
 				#else
-					s << wstring_to_locale( utf8_to_wstring( text ) );
+					s << mpt::convert<std::string>( mpt::logical_encoding::locale, mpt::common_encoding::utf8, text );
 				#endif
 				s.flush();
 			}
Index: openmpt123/openmpt123_config.hpp
===================================================================
--- openmpt123/openmpt123_config.hpp	(revision 14628)
+++ openmpt123/openmpt123_config.hpp	(working copy)
@@ -10,36 +10,8 @@
 #ifndef OPENMPT123_CONFIG_HPP
 #define OPENMPT123_CONFIG_HPP
 
-#define MPT_PP_DEFER(m, ...) m(__VA_ARGS__)
-#define MPT_PP_STRINGIFY(x) #x
-#define MPT_PP_JOIN_HELPER(a, b) a ## b
-#define MPT_PP_JOIN(a, b) MPT_PP_JOIN_HELPER(a, b)
-#define MPT_PP_UNIQUE_IDENTIFIER(prefix) MPT_PP_JOIN(prefix , __LINE__)
+#define MPT_INLINE_NS mpt_openmpt123
 
-#if defined(__clang__)
-#define MPT_WARNING(text)           _Pragma(MPT_PP_STRINGIFY(GCC warning text))
-#define MPT_WARNING_STATEMENT(text) _Pragma(MPT_PP_STRINGIFY(GCC warning text))
-#elif defined(_MSC_VER)
-#define MPT_WARNING(text)           __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
-#define MPT_WARNING_STATEMENT(text) __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
-#elif defined(__GNUC__)
-#define MPT_WARNING(text)           _Pragma(MPT_PP_STRINGIFY(GCC warning text))
-#define MPT_WARNING_STATEMENT(text) _Pragma(MPT_PP_STRINGIFY(GCC warning text))
-#else
-#define MPT_WARNING(text) \
-	static inline int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME) () noexcept { \
-		int warning [[deprecated("Warning: " text)]] = 0; \
-		return warning; \
-	} \
-/**/
-#define MPT_WARNING_STATEMENT(text) \
-	int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME) = [](){ \
-		int warning [[deprecated("Warning: " text)]] = 0; \
-		return warning; \
-	}() \
-/**/
-#endif
-
 #if defined(HAVE_CONFIG_H)
 // wrapper for autoconf macros
 #include "config.h"
Index: openmpt123/openmpt123_mmio.hpp
===================================================================
--- openmpt123/openmpt123_mmio.hpp	(revision 14628)
+++ openmpt123/openmpt123_mmio.hpp	(working copy)
@@ -51,7 +51,7 @@
 		waveformatex.nAvgBytesPerSec = waveformatex.nSamplesPerSec * waveformatex.nBlockAlign;
 
 		#if defined(WIN32) && defined(UNICODE)
-			wchar_t * tmp = _wcsdup( utf8_to_wstring( filename ).c_str() );
+			wchar_t * tmp = _wcsdup( mpt::convert<std::wstring>( mpt::common_encoding::utf8, filename ).c_str() );
 			mmio = mmioOpen( tmp, NULL, MMIO_ALLOCBUF | MMIO_READWRITE | MMIO_CREATE );
 			free( tmp );
 			tmp = 0;
Index: openmpt123/openmpt123_waveout.hpp
===================================================================
--- openmpt123/openmpt123_waveout.hpp	(revision 14628)
+++ openmpt123/openmpt123_waveout.hpp	(working copy)
@@ -185,7 +185,7 @@
 		WAVEOUTCAPSW caps;
 		ZeroMemory( &caps, sizeof( caps ) );
 		waveOutGetDevCapsW( i, &caps, sizeof( caps ) );
-		devices << wstring_to_utf8( caps.szPname );
+		devices << mpt::convert<std::string>( mpt::common_encoding::utf8, caps.szPname );
 		devices << std::endl;
 	}
 	return devices.str();
Index: soundlib/plugins/PluginStructs.h
===================================================================
--- soundlib/plugins/PluginStructs.h	(revision 14628)
+++ soundlib/plugins/PluginStructs.h	(working copy)
@@ -52,8 +52,8 @@
 	uint8le reserved;
 	uint32le dwOutputRouting;		// 0 = send to master 0x80 + x = send to plugin x
 	uint32le dwReserved[4];			// Reserved for routing info
-	mpt::charbuf<32, mpt::String::nullTerminated> szName;         // User-chosen plugin display name - this is locale ANSI!
-	mpt::charbuf<64, mpt::String::nullTerminated> szLibraryName;  // original DLL name - this is UTF-8!
+	mpt::modecharbuf<32, mpt::String::nullTerminated> szName;         // User-chosen plugin display name - this is locale ANSI!
+	mpt::modecharbuf<64, mpt::String::nullTerminated> szLibraryName;  // original DLL name - this is UTF-8!
 
 	// Should only be called from SNDMIXPLUGIN::SetBypass() and IMixPlugin::Bypass()
 	void SetBypass(bool bypass = true) { if(bypass) routingFlags |= irBypass; else routingFlags &= uint8(~irBypass); }
Index: soundlib/SampleFormats.cpp
===================================================================
--- soundlib/SampleFormats.cpp	(revision 14628)
+++ soundlib/SampleFormats.cpp	(working copy)
@@ -580,9 +580,9 @@
 
 struct Wave64FileHeader
 {
-	GUIDms   GuidRIFF;
-	uint64le FileSize;
-	GUIDms   GuidWAVE;
+	mpt::GUIDms GuidRIFF;
+	uint64le    FileSize;
+	mpt::GUIDms GuidWAVE;
 };
 
 MPT_BINARY_STRUCT(Wave64FileHeader, 40)
@@ -590,8 +590,8 @@
 
 struct Wave64ChunkHeader
 {
-	GUIDms   GuidChunk;
-	uint64le Size;
+	mpt::GUIDms GuidChunk;
+	uint64le    Size;
 };
 
 MPT_BINARY_STRUCT(Wave64ChunkHeader, 24)
Index: soundlib/WAVTools.h
===================================================================
--- soundlib/WAVTools.h	(revision 14628)
+++ soundlib/WAVTools.h	(working copy)
@@ -122,10 +122,10 @@
 // Extension of the WAVFormatChunk structure, used if format == formatExtensible
 struct WAVFormatChunkExtension
 {
-	uint16le size;
-	uint16le validBitsPerSample;
-	uint32le channelMask;
-	GUIDms   subFormat;
+	uint16le    size;
+	uint16le    validBitsPerSample;
+	uint32le    channelMask;
+	mpt::GUIDms subFormat;
 };
 
 MPT_BINARY_STRUCT(WAVFormatChunkExtension, 24)
Index: src/mpt/.clang-format
===================================================================
--- src/mpt/.clang-format	(nonexistent)
+++ src/mpt/.clang-format	(working copy)
@@ -0,0 +1,130 @@
+Language: Cpp
+Standard: c++17
+
+AccessModifierOffset: -4 #?
+AlignAfterOpenBracket: AlwaysBreak
+AlignConsecutiveAssignments: false
+AlignConsecutiveBitFields: false
+AlignConsecutiveDeclarations: false
+AlignConsecutiveMacros: true
+AlignEscapedNewlines: DontAlign
+AlignOperands: DontAlign
+AlignTrailingComments: true
+AllowAllArgumentsOnNextLine: true
+AllowAllConstructorInitializersOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: Never
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortEnumsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: Empty
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLambdasOnASingleLine: Inline
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: true
+AlwaysBreakTemplateDeclarations: Yes
+BinPackArguments: true
+BinPackParameters: false
+BraceWrapping:
+ AfterCaseLabel: false
+ AfterClass: false
+ AfterControlStatement: MultiLine
+ AfterEnum: false
+ AfterFunction: false
+ AfterNamespace: false
+ #AfterObjCDeclaration
+ AfterStruct: false
+ AfterUnion: false
+ AfterExternBlock: false
+ BeforeCatch: false
+ BeforeElse: false
+ BeforeLambdaBody: false
+ BeforeWhile: false
+ IndentBraces: false
+ SplitEmptyFunction: true
+ SplitEmptyRecord: false
+ SplitEmptyNamespace: true
+#BreakAfterJavaFieldAnnotations
+BreakBeforeBinaryOperators: NonAssignment
+BreakBeforeBraces: Custom
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializers: BeforeComma
+BreakInheritanceList: BeforeComma
+BreakStringLiterals: false
+ColumnLimit: 0
+CommentPragmas: '' #?
+CompactNamespaces: false
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+ConstructorInitializerIndentWidth: 4 #?
+ContinuationIndentWidth: 4 #?
+Cpp11BracedListStyle: true
+DeriveLineEnding: true
+DerivePointerAlignment: false
+FixNamespaceComments: true
+ForEachMacros: []
+IncludeBlocks: Preserve
+IncludeCategories: [] #?
+IncludeIsMainRegex: '' #?
+IncludeIsMainSourceRegex: '' #?
+IndentCaseLabels: true
+IndentCaseBlocks: true
+IndentExternBlock: NoIndent
+IndentGotoLabels: false
+IndentPPDirectives: None
+InsertTrailingCommas: None
+#BeforeHash
+IndentWidth: 4
+IndentWrappedFunctionNames: true
+#JavaImportGroups
+#JavaScriptQuotes
+#JavaScriptWrapImports
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: '^MPT_TEST_GROUP_BEGIN$' #?
+MacroBlockEnd: '^MPT_TEST_GROUP_END$' #?
+MaxEmptyLinesToKeep: 5
+NamespaceIndentation: None
+NamespaceMacros: [] #?
+#ObjCBinPackProtocolList
+#ObjCBlockIndentWidth
+#ObjCBreakBeforeNestedBlockParam
+#ObjCSpaceAfterProperty
+#ObjCSpaceBeforeProtocolList
+#PenaltyBreakAssignment
+#PenaltyBreakBeforeFirstCallParameter
+#PenaltyBreakComment
+#PenaltyBreakFirstLessLess
+#PenaltyBreakString
+#PenaltyBreakTemplateDeclaration
+#PenaltyExcessCharacter
+#PenaltyReturnTypeOnItsOwnLine
+PointerAlignment: Middle
+#RawStringFormats
+ReflowComments: false
+SortIncludes: false
+SortUsingDeclarations: true
+SpaceAfterCStyleCast: false
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: ControlStatements
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceBeforeSquareBrackets: false
+SpaceInEmptyBlock: true
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: false
+SpacesInCStyleCastParentheses: false
+SpacesInConditionalStatement: false
+SpacesInContainerLiterals: true
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+StatementMacros: [ '_Pragma', '__pragma', MPT_WARNING ] #?
+TabWidth: 4
+TypenameMacros: [] #?
+UseCRLF: false
+UseTab: ForContinuationAndIndentation
+WhitespaceSensitiveMacros:
+  - MPT_PP_STRINGIFY

Property changes on: src/mpt/.clang-format
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-clang-format
\ No newline at end of property
Index: src/mpt/LICENSE.BSD-3-Clause.txt
===================================================================
--- src/mpt/LICENSE.BSD-3-Clause.txt	(nonexistent)
+++ src/mpt/LICENSE.BSD-3-Clause.txt	(working copy)
@@ -0,0 +1,25 @@
+Copyright (c) 2004-2021, OpenMPT Project Developers and Contributors
+Copyright (c) 1997-2003, Olivier Lapicque
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the OpenMPT project nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.

Property changes on: src/mpt/LICENSE.BSD-3-Clause.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: src/mpt/LICENSE.BSL-1.0.txt
===================================================================
--- src/mpt/LICENSE.BSL-1.0.txt	(nonexistent)
+++ src/mpt/LICENSE.BSL-1.0.txt	(working copy)
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.

Property changes on: src/mpt/LICENSE.BSL-1.0.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: src/mpt/base/algorithm.hpp
===================================================================
--- src/mpt/base/algorithm.hpp	(nonexistent)
+++ src/mpt/base/algorithm.hpp	(working copy)
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ALGORITHM_HPP
+#define MPT_BASE_ALGORITHM_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/saturate_cast.hpp"
+
+#include <algorithm>
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Grows x with an exponential factor suitable for increasing buffer sizes.
+// Clamps the result at limit.
+// And avoids integer overflows while doing its business.
+// The growth factor is 1.5, rounding down, execpt for the initial x==1 case.
+template <typename T, typename Tlimit>
+inline T exponential_grow(const T & x, const Tlimit & limit) {
+	if (x <= 1) {
+		return 2;
+	}
+	T add = std::min(x >> 1, std::numeric_limits<T>::max() - x);
+	return std::min(x + add, mpt::saturate_cast<T>(limit));
+}
+
+template <typename T>
+inline T exponential_grow(const T & x) {
+	return mpt::exponential_grow(x, std::numeric_limits<T>::max());
+}
+
+
+// Check if val is in [lo,hi] without causing compiler warnings
+// if theses checks are always true due to the domain of T.
+// GCC does not warn if the type is templated.
+template <typename T, typename C>
+constexpr bool is_in_range(const T & val, const C & lo, const C & hi) {
+	return lo <= val && val <= hi;
+}
+
+
+template <typename Tcontainer, typename Tval>
+MPT_CONSTEXPR20_FUN bool contains(const Tcontainer & container, const Tval & value) noexcept(noexcept(std::find(std::begin(container), std::end(container), value))) {
+	return std::find(std::begin(container), std::end(container), value) != std::end(container);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALGORITHM_HPP

Property changes on: src/mpt/base/algorithm.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/alloc.hpp
===================================================================
--- src/mpt/base/alloc.hpp	(nonexistent)
+++ src/mpt/base/alloc.hpp	(working copy)
@@ -0,0 +1,157 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ALLOC_HPP
+#define MPT_BASE_ALLOC_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/span.hpp"
+
+#include <iterator>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T>
+inline mpt::span<T> as_span(std::vector<T> & cont) {
+	return mpt::span<T>(cont.data(), cont.data() + cont.size());
+}
+
+template <typename T>
+inline mpt::span<const T> as_span(const std::vector<T> & cont) {
+	return mpt::span<const T>(cont.data(), cont.data() + cont.size());
+}
+
+template <typename T>
+inline span<T> as_span(std::basic_string<T> & str) {
+	return span<T>(str.data(), str.size());
+}
+
+template <typename T>
+inline span<const T> as_span(const std::basic_string<T> & str) {
+	return span<const T>(str.data(), str.size());
+}
+
+
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T * beg, T * end) {
+	return std::vector<typename std::remove_const<T>::type>(beg, end);
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T * data, std::size_t size) {
+	return std::vector<typename std::remove_const<T>::type>(data, data + size);
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(mpt::span<T> data) {
+	return std::vector<typename std::remove_const<T>::type>(data.data(), data.data() + data.size());
+}
+
+template <typename T, std::size_t N>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T (&arr)[N]) {
+	return std::vector<typename std::remove_const<T>::type>(std::begin(arr), std::end(arr));
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(const std::basic_string<T> & str) {
+	return std::vector<typename std::remove_const<T>::type>(str.begin(), str.end());
+}
+
+
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T * beg, T * end) {
+	return std::basic_string<typename std::remove_const<T>::type>(beg, end);
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T * data, std::size_t size) {
+	return std::basic_string<typename std::remove_const<T>::type>(data, data + size);
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(mpt::span<T> data) {
+	return std::basic_string<typename std::remove_const<T>::type>(data.data(), data.data() + data.size());
+}
+
+template <typename T, std::size_t N>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T (&arr)[N]) {
+	return std::basic_string<typename std::remove_const<T>::type>(std::begin(arr), std::end(arr));
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(const std::vector<T> & str) {
+	return std::vector<typename std::remove_const<T>::type>(str.begin(), str.end());
+}
+
+
+
+template <typename Tcont2, typename Tcont1>
+inline Tcont1 & append(Tcont1 & cont1, const Tcont2 & cont2) {
+	cont1.insert(cont1.end(), cont2.begin(), cont2.end());
+	return cont1;
+}
+
+template <typename Tit2, typename Tcont1>
+inline Tcont1 & append(Tcont1 & cont1, Tit2 beg, Tit2 end) {
+	cont1.insert(cont1.end(), beg, end);
+	return cont1;
+}
+
+
+
+template <typename Tdst, typename Tsrc>
+struct buffer_cast_impl {
+	inline Tdst operator()(const Tsrc & src) const {
+		return Tdst(mpt::byte_cast<const typename Tdst::value_type *>(src.data()), mpt::byte_cast<const typename Tdst::value_type *>(src.data()) + src.size());
+	}
+};
+
+// casts between vector<->string of byte-castable types
+template <typename Tdst, typename Tsrc>
+inline Tdst buffer_cast(Tsrc src) {
+	return buffer_cast_impl<Tdst, Tsrc>()(src);
+}
+
+
+
+template <typename T>
+struct as_raw_memory_impl<std::vector<T>> {
+	inline mpt::const_byte_span operator()(const std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+	inline mpt::byte_span operator()(std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+};
+
+template <typename T>
+struct as_raw_memory_impl<const std::vector<T>> {
+	inline mpt::const_byte_span operator()(const std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALLOC_HPP

Property changes on: src/mpt/base/alloc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/arithmetic_shift.hpp
===================================================================
--- src/mpt/base/arithmetic_shift.hpp	(nonexistent)
+++ src/mpt/base/arithmetic_shift.hpp	(working copy)
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ARITHMETIC_SHIFT_HPP
+#define MPT_BASE_ARITHMETIC_SHIFT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/saturate_cast.hpp"
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// mpt::rshift_signed
+// mpt::lshift_signed
+// Shift a signed integer value in a well-defined manner.
+// Does the same thing as MSVC would do. This is verified by the test suite.
+
+template <typename T>
+constexpr auto rshift_signed_standard(T x, int y) noexcept -> decltype(x >> y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	using result_type = decltype(x >> y);
+	using unsigned_result_type = typename std::make_unsigned<result_type>::type;
+	const unsigned_result_type roffset = static_cast<unsigned_result_type>(1) << ((sizeof(result_type) * 8) - 1);
+	result_type rx = x;
+	unsigned_result_type urx = static_cast<unsigned_result_type>(rx);
+	urx += roffset;
+	urx >>= y;
+	urx -= roffset >> y;
+	return static_cast<result_type>(urx);
+}
+
+template <typename T>
+constexpr auto lshift_signed_standard(T x, int y) noexcept -> decltype(x << y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	using result_type = decltype(x << y);
+	using unsigned_result_type = typename std::make_unsigned<result_type>::type;
+	const unsigned_result_type roffset = static_cast<unsigned_result_type>(1) << ((sizeof(result_type) * 8) - 1);
+	result_type rx = x;
+	unsigned_result_type urx = static_cast<unsigned_result_type>(rx);
+	urx += roffset;
+	urx <<= y;
+	urx -= roffset << y;
+	return static_cast<result_type>(urx);
+}
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+template <typename T>
+constexpr auto rshift_signed_undefined(T x, int y) noexcept -> decltype(x >> y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	return x >> y;
+}
+
+template <typename T>
+constexpr auto lshift_signed_undefined(T x, int y) noexcept -> decltype(x << y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	return x << y;
+}
+
+template <typename T>
+constexpr auto rshift_signed(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed_undefined(x, y);
+}
+
+template <typename T>
+constexpr auto lshift_signed(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed_undefined(x, y);
+}
+
+#else
+
+template <typename T>
+constexpr auto rshift_signed(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed_standard(x, y);
+}
+
+template <typename T>
+constexpr auto lshift_signed(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed_standard(x, y);
+}
+
+#endif
+
+template <typename T>
+constexpr auto arithmetic_shift_right(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto arithmetic_shift_right(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto sar(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto sal(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed(x, y);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ARITHMETIC_SHIFT_HPP

Property changes on: src/mpt/base/arithmetic_shift.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/array.hpp
===================================================================
--- src/mpt/base/array.hpp	(nonexistent)
+++ src/mpt/base/array.hpp	(working copy)
@@ -0,0 +1,82 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ARRAY_HPP
+#define MPT_BASE_ARRAY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename T>
+struct stdarray_extent : std::integral_constant<std::size_t, 0> { };
+
+template <typename T, std::size_t N>
+struct stdarray_extent<std::array<T, N>> : std::integral_constant<std::size_t, N> { };
+
+template <typename T>
+struct is_stdarray : std::false_type { };
+
+template <typename T, std::size_t N>
+struct is_stdarray<std::array<T, N>> : std::true_type { };
+
+// mpt::extent is the same as std::extent,
+// but also works for std::array,
+// and asserts that the given type is actually an array type instead of returning 0.
+// use as:
+// mpt::extent<decltype(expr)>()
+// mpt::extent<decltype(variable)>()
+// mpt::extent<decltype(type)>()
+// mpt::extent<type>()
+template <typename T>
+constexpr std::size_t extent() noexcept {
+	using Tarray = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
+	static_assert(std::is_array<Tarray>::value || mpt::is_stdarray<Tarray>::value);
+	if constexpr (mpt::is_stdarray<Tarray>::value) {
+		return mpt::stdarray_extent<Tarray>();
+	} else {
+		return std::extent<Tarray>();
+	}
+}
+
+template <typename>
+struct array_size;
+
+template <typename T, std::size_t N>
+struct array_size<std::array<T, N>> {
+	static constexpr std::size_t size = N;
+};
+
+template <typename T, std::size_t N>
+struct array_size<T[N]> {
+	static constexpr std::size_t size = N;
+};
+
+
+template <typename T, std::size_t N, typename Tx>
+constexpr std::array<T, N> init_array(const Tx & x) {
+	std::array<T, N> result{};
+	for (std::size_t i = 0; i < N; ++i) {
+		result[i] = x;
+	}
+	return result;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ARRAY_HPP

Property changes on: src/mpt/base/array.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/bit.hpp
===================================================================
--- src/mpt/base/bit.hpp	(nonexistent)
+++ src/mpt/base/bit.hpp	(working copy)
@@ -0,0 +1,392 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_BIT_HPP
+#define MPT_BASE_BIT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/macros.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <bit>
+#else // !C++20
+#include <array>
+#include <limits>
+#endif // C++20
+#include <type_traits>
+
+#include <cstddef>
+#if MPT_CXX_BEFORE(20)
+#include <cstring>
+#endif // !C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+using std::bit_cast;
+#else
+// C++2a compatible bit_cast.
+// Not implementing constexpr because this is not easily possible pre C++20.
+template <typename Tdst, typename Tsrc>
+MPT_FORCEINLINE typename std::enable_if<(sizeof(Tdst) == sizeof(Tsrc)) && std::is_trivially_copyable<Tsrc>::value && std::is_trivially_copyable<Tdst>::value, Tdst>::type bit_cast(const Tsrc & src) noexcept {
+	Tdst dst{};
+	std::memcpy(&dst, &src, sizeof(Tdst));
+	return dst;
+}
+#endif
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::endian;
+
+static_assert(mpt::endian::big != mpt::endian::little, "platform with all scalar types having size 1 is not supported");
+
+constexpr mpt::endian get_endian() noexcept {
+	return mpt::endian::native;
+}
+
+constexpr bool endian_is_little() noexcept {
+	return get_endian() == mpt::endian::little;
+}
+
+constexpr bool endian_is_big() noexcept {
+	return get_endian() == mpt::endian::big;
+}
+
+constexpr bool endian_is_weird() noexcept {
+	return !endian_is_little() && !endian_is_big();
+}
+
+#else // !C++20
+
+#if !MPT_COMPILER_GENERIC
+
+#if MPT_COMPILER_MSVC
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#endif
+#endif
+
+// fallback:
+#if !defined(MPT_PLATFORM_BIG_ENDIAN) && !defined(MPT_PLATFORM_LITTLE_ENDIAN)
+// taken from boost/detail/endian.hpp
+#if (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) \
+	|| (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) \
+	|| (defined(_STLP_BIG_ENDIAN) && !defined(_STLP_LITTLE_ENDIAN))
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) \
+	|| (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) \
+	|| (defined(_STLP_LITTLE_ENDIAN) && !defined(_STLP_BIG_ENDIAN))
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#elif defined(__sparc) || defined(__sparc__) \
+	|| defined(_POWER) || defined(__powerpc__) \
+	|| defined(__ppc__) || defined(__hpux) || defined(__hppa) \
+	|| defined(_MIPSEB) || defined(_POWER) \
+	|| defined(__s390__)
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif defined(__i386__) || defined(__alpha__) \
+	|| defined(__ia64) || defined(__ia64__) \
+	|| defined(_M_IX86) || defined(_M_IA64) \
+	|| defined(_M_ALPHA) || defined(__amd64) \
+	|| defined(__amd64__) || defined(_M_AMD64) \
+	|| defined(__x86_64) || defined(__x86_64__) \
+	|| defined(_M_X64) || defined(__bfin__)
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#endif
+#endif
+
+#endif // !MPT_COMPILER_GENERIC
+
+enum class endian
+{
+	little = 0x78563412u,
+	big = 0x12345678u,
+	weird = 1u,
+#if MPT_COMPILER_GENERIC
+	native = 0u,
+#elif defined(MPT_PLATFORM_LITTLE_ENDIAN)
+	native = little,
+#elif defined(MPT_PLATFORM_BIG_ENDIAN)
+	native = big,
+#else
+	native = 0u,
+#endif
+};
+
+static_assert(mpt::endian::big != mpt::endian::little, "platform with all scalar types having size 1 is not supported");
+
+MPT_FORCEINLINE mpt::endian endian_probe() noexcept {
+	using endian_probe_type = uint32;
+	static_assert(sizeof(endian_probe_type) == 4);
+	constexpr endian_probe_type endian_probe_big = 0x12345678u;
+	constexpr endian_probe_type endian_probe_little = 0x78563412u;
+	const std::array<std::byte, sizeof(endian_probe_type)> probe{{std::byte{0x12}, std::byte{0x34}, std::byte{0x56}, std::byte{0x78}}};
+	const endian_probe_type test = mpt::bit_cast<endian_probe_type>(probe);
+	mpt::endian result = mpt::endian::native;
+	switch (test) {
+		case endian_probe_big:
+			result = mpt::endian::big;
+			break;
+		case endian_probe_little:
+			result = mpt::endian::little;
+			break;
+		default:
+			result = mpt::endian::weird;
+			break;
+	}
+	return result;
+}
+
+MPT_FORCEINLINE mpt::endian get_endian() noexcept {
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 6285) // false-positive: (<non-zero constant> || <non-zero constant>) is always a non-zero constant.
+#endif                          // MPT_COMPILER_MSVC
+	if constexpr ((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+		return mpt::endian::native;
+	} else {
+		return mpt::endian_probe();
+	}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+}
+
+MPT_FORCEINLINE bool endian_is_little() noexcept {
+	return get_endian() == mpt::endian::little;
+}
+
+MPT_FORCEINLINE bool endian_is_big() noexcept {
+	return get_endian() == mpt::endian::big;
+}
+
+MPT_FORCEINLINE bool endian_is_weird() noexcept {
+	return !endian_is_little() && !endian_is_big();
+}
+
+#endif // C++20
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::bit_ceil;
+using std::bit_floor;
+using std::bit_width;
+using std::countl_one;
+using std::countl_zero;
+using std::countr_one;
+using std::countr_zero;
+using std::has_single_bit;
+using std::popcount;
+using std::rotl;
+using std::rotr;
+
+#else // !C++20
+
+// C++20 <bit> header.
+// Note that we do not use SFINAE here but instead rely on static_assert.
+
+template <typename T>
+constexpr int popcount(T val) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int result = 0;
+	while (val > 0) {
+		if (val & 0x1) {
+			result++;
+		}
+		val >>= 1;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr bool has_single_bit(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	return mpt::popcount(x) == 1;
+}
+
+template <typename T>
+constexpr T bit_ceil(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	T result = 1;
+	while (result < x) {
+		T newresult = result << 1;
+		if (newresult < result) {
+			return 0;
+		}
+		result = newresult;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr T bit_floor(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	if (x == 0) {
+		return 0;
+	}
+	T result = 1;
+	do {
+		T newresult = result << 1;
+		if (newresult < result) {
+			return result;
+		}
+		result = newresult;
+	} while (result <= x);
+	return result >> 1;
+}
+
+template <typename T>
+constexpr T bit_width(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	T result = 0;
+	while (x > 0) {
+		x >>= 1;
+		result += 1;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr int countl_zero(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = std::numeric_limits<T>::digits - 1; bit >= 0; --bit) {
+		if ((x & (1u << bit)) == 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countl_one(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = std::numeric_limits<T>::digits - 1; bit >= 0; --bit) {
+		if ((x & (1u << bit)) != 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countr_zero(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = 0; bit < std::numeric_limits<T>::digits; ++bit) {
+		if ((x & (1u << bit)) == 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countr_one(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = 0; bit < std::numeric_limits<T>::digits; ++bit) {
+		if ((x & (1u << bit)) != 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr T rotl_impl(T x, int r) noexcept {
+	auto N = std::numeric_limits<T>::digits;
+	return (x >> (N - r)) | (x << r);
+}
+
+template <typename T>
+constexpr T rotr_impl(T x, int r) noexcept {
+	auto N = std::numeric_limits<T>::digits;
+	return (x << (N - r)) | (x >> r);
+}
+
+template <typename T>
+constexpr T rotl(T x, int s) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	auto N = std::numeric_limits<T>::digits;
+	auto r = s % N;
+	return (s < 0) ? mpt::rotr_impl(x, -s) : ((x >> (N - r)) | (x << r));
+}
+
+template <typename T>
+constexpr T rotr(T x, int s) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	auto N = std::numeric_limits<T>::digits;
+	auto r = s % N;
+	return (s < 0) ? mpt::rotl_impl(x, -s) : ((x << (N - r)) | (x >> r));
+}
+
+#endif // C++20
+
+
+
+template <typename T>
+constexpr int lower_bound_entropy_bits(T x_) {
+	typename std::make_unsigned<T>::type x = static_cast<typename std::make_unsigned<T>::type>(x_);
+	return mpt::bit_width(x) == static_cast<typename std::make_unsigned<T>::type>(mpt::popcount(x)) ? mpt::bit_width(x) : mpt::bit_width(x) - 1;
+}
+
+
+template <typename T>
+constexpr bool is_mask(T x) {
+	static_assert(std::is_integral<T>::value);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	unsigned_T ux = static_cast<unsigned_T>(x);
+	unsigned_T mask = 0;
+	for (std::size_t bits = 0; bits <= (sizeof(unsigned_T) * 8); ++bits) {
+		mask = (mask << 1) | 1u;
+		if (ux == mask) {
+			return true;
+		}
+	}
+	return false;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_BIT_HPP

Property changes on: src/mpt/base/bit.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/check_platform.hpp
===================================================================
--- src/mpt/base/check_platform.hpp	(nonexistent)
+++ src/mpt/base/check_platform.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_CHECK_PLATFORM_HPP
+#define MPT_BASE_CHECK_PLATFORM_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/pointer.hpp"
+
+#include <limits>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+static_assert(sizeof(std::uintptr_t) == sizeof(void *));
+static_assert(std::numeric_limits<unsigned char>::digits == 8);
+
+static_assert(sizeof(char) == 1);
+
+static_assert(sizeof(std::byte) == 1);
+static_assert(alignof(std::byte) == 1);
+
+static_assert(mpt::arch_bits == static_cast<int>(mpt::pointer_size) * 8);
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_CHECK_PLATFORM_HPP

Property changes on: src/mpt/base/check_platform.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/compiletime_warning.hpp
===================================================================
--- src/mpt/base/compiletime_warning.hpp	(nonexistent)
+++ src/mpt/base/compiletime_warning.hpp	(working copy)
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_COMPILETIME_WARNING_HPP
+#define MPT_BASE_COMPILETIME_WARNING_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/preprocessor.hpp"
+
+
+
+#if MPT_COMPILER_MSVC
+
+#define MPT_WARNING(text)           __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
+#define MPT_WARNING_STATEMENT(text) __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
+
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+
+#define MPT_WARNING(text)           _Pragma(MPT_PP_STRINGIFY(GCC warning text))
+#define MPT_WARNING_STATEMENT(text) _Pragma(MPT_PP_STRINGIFY(GCC warning text))
+
+#else
+
+// portable #pragma message or #warning replacement
+#define MPT_WARNING(text) \
+	static inline int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME)() noexcept { \
+		int warning [[deprecated("Warning: " text)]] = 0; \
+		return warning; \
+	} \
+/**/
+#define MPT_WARNING_STATEMENT(text) \
+	int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME) = []() { \
+		int warning [[deprecated("Warning: " text)]] = 0; \
+		return warning; \
+	}() /**/
+
+#endif
+
+
+
+#endif // MPT_BASE_COMPILETIME_WARNING_HPP

Property changes on: src/mpt/base/compiletime_warning.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/constexpr_throw.hpp
===================================================================
--- src/mpt/base/constexpr_throw.hpp	(nonexistent)
+++ src/mpt/base/constexpr_throw.hpp	(working copy)
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_CONSTEXPR_THROW_HPP
+#define MPT_BASE_CONSTEXPR_THROW_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Work-around for the requirement of at least 1 non-throwing function argument combination in C++ (17,2a).
+
+template <typename Exception>
+constexpr bool constexpr_throw_helper(Exception && e, bool really = true) {
+	//return !really ? really : throw std::forward<Exception>(e);
+	if (really) {
+		throw std::forward<Exception>(e);
+	}
+	// cppcheck-suppress identicalConditionAfterEarlyExit
+	return really;
+}
+
+template <typename Exception>
+constexpr bool constexpr_throw(Exception && e) {
+	return mpt::constexpr_throw_helper(std::forward<Exception>(e));
+}
+
+template <typename T, typename Exception>
+constexpr T constexpr_throw_helper(Exception && e, bool really = true) {
+	//return !really ? really : throw std::forward<Exception>(e);
+	if (really) {
+		throw std::forward<Exception>(e);
+	}
+	return T{};
+}
+
+template <typename T, typename Exception>
+constexpr T constexpr_throw(Exception && e) {
+	return mpt::constexpr_throw_helper<T>(std::forward<Exception>(e));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_CONSTEXPR_THROW_HPP

Property changes on: src/mpt/base/constexpr_throw.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect.hpp
===================================================================
--- src/mpt/base/detect.hpp	(nonexistent)
+++ src/mpt/base/detect.hpp	(working copy)
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_HPP
+#define MPT_BASE_DETECT_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+#include "mpt/base/detect_libcxx.hpp"
+#include "mpt/base/detect_libc.hpp"
+
+
+
+#endif // MPT_BASE_DETECT_HPP

Property changes on: src/mpt/base/detect.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_compiler.hpp
===================================================================
--- src/mpt/base/detect_compiler.hpp	(nonexistent)
+++ src/mpt/base/detect_compiler.hpp	(working copy)
@@ -0,0 +1,170 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_COMPILER_HPP
+#define MPT_BASE_DETECT_COMPILER_HPP
+
+
+
+#define MPT_COMPILER_MAKE_VERSION2(version, sp)         ((version)*100 + (sp))
+#define MPT_COMPILER_MAKE_VERSION3(major, minor, patch) ((major)*10000 + (minor)*100 + (patch))
+
+
+
+#if defined(MPT_COMPILER_GENERIC)
+
+#undef MPT_COMPILER_GENERIC
+#define MPT_COMPILER_GENERIC 1
+
+#elif defined(__clang__) && defined(_MSC_VER) && defined(__c2__)
+
+#error "Clang/C2 is not supported. Please use Clang/LLVM for Windows instead."
+
+#elif defined(__clang__)
+
+#define MPT_COMPILER_CLANG                      1
+#define MPT_COMPILER_CLANG_VERSION              MPT_COMPILER_MAKE_VERSION3(__clang_major__, __clang_minor__, __clang_patchlevel__)
+#define MPT_CLANG_AT_LEAST(major, minor, patch) (MPT_COMPILER_CLANG_VERSION >= MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+#define MPT_CLANG_BEFORE(major, minor, patch)   (MPT_COMPILER_CLANG_VERSION < MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+
+#if MPT_CLANG_BEFORE(7, 0, 0)
+#error "clang version 7 required"
+#endif
+
+#if defined(__clang_analyzer__)
+#ifndef MPT_BUILD_ANALYZED
+#define MPT_BUILD_ANALYZED
+#endif
+#endif
+
+#elif defined(__GNUC__)
+
+#define MPT_COMPILER_GCC                      1
+#define MPT_COMPILER_GCC_VERSION              MPT_COMPILER_MAKE_VERSION3(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+#define MPT_GCC_AT_LEAST(major, minor, patch) (MPT_COMPILER_GCC_VERSION >= MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+#define MPT_GCC_BEFORE(major, minor, patch)   (MPT_COMPILER_GCC_VERSION < MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+
+#if MPT_GCC_BEFORE(8, 1, 0)
+#error "GCC version 8.1 required"
+#endif
+
+#elif defined(_MSC_VER)
+
+#define MPT_COMPILER_MSVC 1
+#if (_MSC_VER >= 1926)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 6)
+#elif (_MSC_VER >= 1925)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 5)
+#elif (_MSC_VER >= 1924)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 4)
+#elif (_MSC_VER >= 1923)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 3)
+#elif (_MSC_VER >= 1922)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 2)
+#elif (_MSC_VER >= 1921)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 1)
+#elif (_MSC_VER >= 1920)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 0)
+#elif (_MSC_VER >= 1916)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 9)
+#elif (_MSC_VER >= 1915)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 8)
+#elif (_MSC_VER >= 1914)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 7)
+#elif (_MSC_VER >= 1913)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 6)
+#elif (_MSC_VER >= 1912)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 5)
+#elif (_MSC_VER >= 1911)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 3)
+#elif (_MSC_VER >= 1910)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 0)
+#elif (_MSC_VER >= 1900) && defined(_MSVC_LANG)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2015, 3)
+#elif (_MSC_VER >= 1900)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2015, 0)
+#elif (_MSC_VER >= 1800)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2013, 0)
+#elif (_MSC_VER >= 1700)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2012, 0)
+#elif (_MSC_VER >= 1600)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2010, 0)
+#elif (_MSC_VER >= 1500)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2008, 0)
+#else
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2005, 0)
+#endif
+#define MPT_MSVC_AT_LEAST(version, sp) (MPT_COMPILER_MSVC_VERSION >= MPT_COMPILER_MAKE_VERSION2((version), (sp)))
+#define MPT_MSVC_BEFORE(version, sp)   (MPT_COMPILER_MSVC_VERSION < MPT_COMPILER_MAKE_VERSION2((version), (sp)))
+
+#if MPT_MSVC_BEFORE(2017, 9)
+#error "MSVC version 2017 15.9 required"
+#endif
+
+#if defined(_PREFAST_)
+#ifndef MPT_BUILD_ANALYZED
+#define MPT_BUILD_ANALYZED
+#endif
+#endif
+
+#else
+
+#define MPT_COMPILER_GENERIC 1
+
+#endif
+
+
+
+#ifndef MPT_COMPILER_GENERIC
+#define MPT_COMPILER_GENERIC 0
+#endif
+#ifndef MPT_COMPILER_CLANG
+#define MPT_COMPILER_CLANG                      0
+#define MPT_CLANG_AT_LEAST(major, minor, patch) 0
+#define MPT_CLANG_BEFORE(major, minor, patch)   0
+#endif
+#ifndef MPT_COMPILER_GCC
+#define MPT_COMPILER_GCC                      0
+#define MPT_GCC_AT_LEAST(major, minor, patch) 0
+#define MPT_GCC_BEFORE(major, minor, patch)   0
+#endif
+#ifndef MPT_COMPILER_MSVC
+#define MPT_COMPILER_MSVC              0
+#define MPT_MSVC_AT_LEAST(version, sp) 0
+#define MPT_MSVC_BEFORE(version, sp)   0
+#endif
+
+
+
+#if MPT_COMPILER_GENERIC || MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+
+#if (__cplusplus >= 201703)
+#define MPT_CXX 17
+#else
+#define MPT_CXX 17
+#endif
+
+#elif MPT_COMPILER_MSVC
+
+#if (_MSVC_LANG >= 201703)
+#define MPT_CXX 17
+#else
+#define MPT_CXX 17
+#endif
+
+#else
+
+#define MPT_CXX 17
+
+#endif
+
+// MPT_CXX is stricter than just using __cplusplus directly.
+// We will only claim a language version as supported IFF all core language and
+// library fatures that we need are actually supported AND working correctly
+// (to our needs).
+
+#define MPT_CXX_AT_LEAST(version) (MPT_CXX >= (version))
+#define MPT_CXX_BEFORE(version)   (MPT_CXX < (version))
+
+
+
+#endif // MPT_BASE_DETECT_COMPILER_HPP

Property changes on: src/mpt/base/detect_compiler.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_libc.hpp
===================================================================
--- src/mpt/base/detect_libc.hpp	(nonexistent)
+++ src/mpt/base/detect_libc.hpp	(working copy)
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_LIBC_HPP
+#define MPT_BASE_DETECT_LIBC_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+
+#include <cstddef>
+
+
+
+// order of checks is important!
+#if MPT_COMPILER_GENERIC
+#define MPT_LIBC_GENERIC 1
+#elif MPT_COMPILER_GCC && (defined(__MINGW32__) || defined(__MINGW64__))
+#define MPT_LIBC_MS 1
+#elif defined(__GNU_LIBRARY__)
+#define MPT_LIBC_GLIBC 1
+#elif MPT_COMPILER_MSVC
+#define MPT_LIBC_MS 1
+#elif MPT_COMPILER_CLANG && MPT_OS_WINDOWS
+#define MPT_LIBC_MS 1
+#else
+#define MPT_LIBC_GENERIC 1
+#endif
+
+#ifndef MPT_LIBC_GENERIC
+#define MPT_LIBC_GENERIC 0
+#endif
+#ifndef MPT_LIBC_GLIBC
+#define MPT_LIBC_GLIBC 0
+#endif
+#ifndef MPT_LIBC_MS
+#define MPT_LIBC_MS 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_LIBC_HPP

Property changes on: src/mpt/base/detect_libc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_libcxx.hpp
===================================================================
--- src/mpt/base/detect_libcxx.hpp	(nonexistent)
+++ src/mpt/base/detect_libcxx.hpp	(working copy)
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_LIBCXX_HPP
+#define MPT_BASE_DETECT_LIBCXX_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <version>
+#else // !C++20
+#include <array>
+#endif // C++20
+
+
+
+// order of checks is important!
+#if MPT_COMPILER_GENERIC
+#define MPT_LIBCXX_GENERIC 1
+#elif defined(_LIBCPP_VERSION)
+#define MPT_LIBCXX_LLVM 1
+#elif defined(__GLIBCXX__) || defined(__GLIBCPP__)
+#define MPT_LIBCXX_GNU 1
+#elif MPT_COMPILER_MSVC
+#define MPT_LIBCXX_MS 1
+#elif MPT_COMPILER_CLANG && MPT_OS_WINDOWS
+#define MPT_LIBCXX_MS 1
+#else
+#define MPT_LIBCXX_GENERIC 1
+#endif
+
+#ifndef MPT_LIBCXX_GENERIC
+#define MPT_LIBCXX_GENERIC 0
+#endif
+#ifndef MPT_LIBCXX_LLVM
+#define MPT_LIBCXX_LLVM 0
+#endif
+#ifndef MPT_LIBCXX_GNU
+#define MPT_LIBCXX_GNU 0
+#endif
+#ifndef MPT_LIBCXX_MS
+#define MPT_LIBCXX_MS 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_LIBCXX_HPP

Property changes on: src/mpt/base/detect_libcxx.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_os.hpp
===================================================================
--- src/mpt/base/detect_os.hpp	(nonexistent)
+++ src/mpt/base/detect_os.hpp	(working copy)
@@ -0,0 +1,109 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_OS_HPP
+#define MPT_BASE_DETECT_OS_HPP
+
+
+
+// The order of the checks matters!
+#if defined(__DJGPP__)
+#define MPT_OS_DJGPP 1
+#elif defined(__EMSCRIPTEN__)
+#define MPT_OS_EMSCRIPTEN 1
+#if defined(__EMSCRIPTEN_major__) && defined(__EMSCRIPTEN_minor__)
+#if (__EMSCRIPTEN_major__ > 1)
+// ok
+#elif (__EMSCRIPTEN_major__ == 1) && (__EMSCRIPTEN_minor__ > 39)
+// ok
+#elif (__EMSCRIPTEN_major__ == 1) && (__EMSCRIPTEN_minor__ == 39) && (__EMSCRIPTEN_tiny__ >= 7)
+// ok
+#else
+#error "Emscripten >= 1.39.7 is required."
+#endif
+#endif
+#elif defined(_WIN32)
+#define MPT_OS_WINDOWS 1
+#if defined(WINAPI_FAMILY)
+#include <winapifamily.h>
+#if (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
+#define MPT_OS_WINDOWS_WINRT 0
+#else
+#define MPT_OS_WINDOWS_WINRT 1
+#endif
+#else // !WINAPI_FAMILY
+#define MPT_OS_WINDOWS_WINRT 0
+#endif // WINAPI_FAMILY
+#elif defined(__APPLE__)
+#define MPT_OS_MACOSX_OR_IOS 1
+//#include "TargetConditionals.h"
+//#if TARGET_IPHONE_SIMULATOR
+//#elif TARGET_OS_IPHONE
+//#elif TARGET_OS_MAC
+//#else
+//#endif
+#elif defined(__HAIKU__)
+#define MPT_OS_HAIKU 1
+#elif defined(__ANDROID__) || defined(ANDROID)
+#define MPT_OS_ANDROID 1
+#elif defined(__linux__)
+#define MPT_OS_LINUX 1
+#elif defined(__DragonFly__)
+#define MPT_OS_DRAGONFLYBSD 1
+#elif defined(__FreeBSD__)
+#define MPT_OS_FREEBSD 1
+#elif defined(__OpenBSD__)
+#define MPT_OS_OPENBSD 1
+#elif defined(__NetBSD__)
+#define MPT_OS_NETBSD 1
+#elif defined(__unix__)
+#define MPT_OS_GENERIC_UNIX 1
+#else
+#define MPT_OS_UNKNOWN 1
+#endif
+
+#ifndef MPT_OS_DJGPP
+#define MPT_OS_DJGPP 0
+#endif
+#ifndef MPT_OS_EMSCRIPTEN
+#define MPT_OS_EMSCRIPTEN 0
+#endif
+#ifndef MPT_OS_WINDOWS
+#define MPT_OS_WINDOWS 0
+#endif
+#ifndef MPT_OS_WINDOWS_WINRT
+#define MPT_OS_WINDOWS_WINRT 0
+#endif
+#ifndef MPT_OS_MACOSX_OR_IOS
+#define MPT_OS_MACOSX_OR_IOS 0
+#endif
+#ifndef MPT_OS_HAIKU
+#define MPT_OS_HAIKU 0
+#endif
+#ifndef MPT_OS_ANDROID
+#define MPT_OS_ANDROID 0
+#endif
+#ifndef MPT_OS_LINUX
+#define MPT_OS_LINUX 0
+#endif
+#ifndef MPT_OS_DRAGONFLYBSD
+#define MPT_OS_DRAGONFLYBSD 0
+#endif
+#ifndef MPT_OS_FREEBSD
+#define MPT_OS_FREEBSD 0
+#endif
+#ifndef MPT_OS_OPENBSD
+#define MPT_OS_OPENBSD 0
+#endif
+#ifndef MPT_OS_NETBSD
+#define MPT_OS_NETBSD 0
+#endif
+#ifndef MPT_OS_GENERIC_UNIX
+#define MPT_OS_GENERIC_UNIX 0
+#endif
+#ifndef MPT_OS_UNKNOWN
+#define MPT_OS_UNKNOWN 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_OS.hpp

Property changes on: src/mpt/base/detect_os.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_quirks.hpp
===================================================================
--- src/mpt/base/detect_quirks.hpp	(nonexistent)
+++ src/mpt/base/detect_quirks.hpp	(working copy)
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_QUIRKS_HPP
+#define MPT_BASE_DETECT_QUIRKS_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+
+
+
+#if MPT_COMPILER_MSVC
+// Compiler has multiplication/division semantics when shifting signed integers.
+#define MPT_COMPILER_SHIFT_SIGNED 1
+#endif
+
+#ifndef MPT_COMPILER_SHIFT_SIGNED
+#define MPT_COMPILER_SHIFT_SIGNED 0
+#endif
+
+
+
+// This should really be based on __STDCPP_THREADS__, but that is not defined by
+// GCC or clang. Stupid.
+// Just assume multithreaded and disable for platforms we know are
+// singlethreaded later on.
+#define MPT_PLATFORM_MULTITHREADED 1
+
+#if MPT_OS_DJGPP
+#undef MPT_PLATFORM_MULTITHREADED
+#define MPT_PLATFORM_MULTITHREADED 0
+#endif
+
+#if (MPT_OS_EMSCRIPTEN && !defined(__EMSCRIPTEN_PTHREADS__))
+#undef MPT_PLATFORM_MULTITHREADED
+#define MPT_PLATFORM_MULTITHREADED 0
+#endif
+
+
+
+#if MPT_OS_EMSCRIPTEN && defined(MPT_BUILD_AUDIOWORKLETPROCESSOR)
+#define MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK
+#endif
+
+
+
+#if MPT_OS_EMSCRIPTEN && defined(MPT_BUILD_AUDIOWORKLETPROCESSOR)
+#define MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+#endif
+
+
+
+#if MPT_OS_DJGPP
+#define MPT_COMPILER_QUIRK_NO_WCHAR
+#endif
+
+
+
+#if defined(__arm__)
+
+#if defined(__SOFTFP__)
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 1
+#else
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+#if defined(__VFP_FP__)
+// native-endian IEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 0
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      0
+#elif defined(__MAVERICK__)
+// little-endian IEEE754, we assume native-endian though
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 1
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      0
+#else
+// not IEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 1
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      1
+#endif
+
+#elif defined(__mips__)
+
+#if defined(__mips_soft_float)
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 1
+#else
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+
+#endif
+
+#if MPT_OS_EMSCRIPTEN
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER64 1
+#endif
+
+#ifndef MPT_COMPILER_QUIRK_FLOAT_PREFER32
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER32 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_PREFER64
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER64 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_EMULATED
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_QUIRKS_HPP

Property changes on: src/mpt/base/detect_quirks.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/floatingpoint.hpp
===================================================================
--- src/mpt/base/floatingpoint.hpp	(nonexistent)
+++ src/mpt/base/floatingpoint.hpp	(working copy)
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_FLOATINGPOINT_HPP
+#define MPT_BASE_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// fp half
+// n/a
+
+// fp single
+using single = float;
+namespace float_literals {
+constexpr single operator"" _fs(long double lit) noexcept {
+	return static_cast<single>(lit);
+}
+} // namespace float_literals
+
+// fp double
+namespace float_literals {
+constexpr double operator"" _fd(long double lit) noexcept {
+	return static_cast<double>(lit);
+}
+} // namespace float_literals
+
+// fp extended
+namespace float_literals {
+constexpr long double operator"" _fe(long double lit) noexcept {
+	return static_cast<long double>(lit);
+}
+} // namespace float_literals
+
+// fp quad
+// n/a
+
+using float32 = std::conditional<sizeof(float) == 4, float, std::conditional<sizeof(double) == 4, double, std::conditional<sizeof(long double) == 4, long double, float>::type>::type>::type;
+namespace float_literals {
+constexpr float32 operator"" _f32(long double lit) noexcept {
+	return static_cast<float32>(lit);
+}
+} // namespace float_literals
+
+using float64 = std::conditional<sizeof(float) == 8, float, std::conditional<sizeof(double) == 8, double, std::conditional<sizeof(long double) == 8, long double, double>::type>::type>::type;
+namespace float_literals {
+constexpr float64 operator"" _f64(long double lit) noexcept {
+	return static_cast<float64>(lit);
+}
+} // namespace float_literals
+
+template <typename T>
+struct float_traits {
+	static constexpr bool is_float = !std::numeric_limits<T>::is_integer;
+	static constexpr bool is_hard = is_float && !MPT_COMPILER_QUIRK_FLOAT_EMULATED;
+	static constexpr bool is_soft = is_float && MPT_COMPILER_QUIRK_FLOAT_EMULATED;
+	static constexpr bool is_float32 = is_float && (sizeof(T) == 4);
+	static constexpr bool is_float64 = is_float && (sizeof(T) == 8);
+	static constexpr bool is_native_endian = is_float && !MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN;
+	static constexpr bool is_ieee754_binary = is_float && std::numeric_limits<T>::is_iec559 && !MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754;
+	static constexpr bool is_ieee754_binary32 = is_float && is_ieee754_binary && is_float32;
+	static constexpr bool is_ieee754_binary64 = is_float && is_ieee754_binary && is_float64;
+	static constexpr bool is_ieee754_binary32ne = is_float && is_ieee754_binary && is_float32 && is_native_endian;
+	static constexpr bool is_ieee754_binary64ne = is_float && is_ieee754_binary && is_float64 && is_native_endian;
+	static constexpr bool is_preferred = is_float && ((is_float32 && MPT_COMPILER_QUIRK_FLOAT_PREFER32) || (is_float64 && MPT_COMPILER_QUIRK_FLOAT_PREFER64));
+};
+
+// prefer smaller floats, but try to use IEEE754 floats
+using nativefloat =
+	std::conditional<mpt::float_traits<float32>::is_preferred, float32, std::conditional<mpt::float_traits<float64>::is_preferred, float64, std::conditional<std::numeric_limits<float>::is_iec559, float, std::conditional<std::numeric_limits<double>::is_iec559, double, std::conditional<std::numeric_limits<long double>::is_iec559, long double, float>::type>::type>::type>::type>::type;
+namespace float_literals {
+constexpr nativefloat operator"" _nf(long double lit) noexcept {
+	return static_cast<nativefloat>(lit);
+}
+} // namespace float_literals
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_FLOATINGPOINT_HPP

Property changes on: src/mpt/base/floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/integer.hpp
===================================================================
--- src/mpt/base/integer.hpp	(nonexistent)
+++ src/mpt/base/integer.hpp	(working copy)
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_INTEGER_HPP
+#define MPT_BASE_INTEGER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <cstdint>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+using int8 = std::int8_t;
+using int16 = std::int16_t;
+using int32 = std::int32_t;
+using int64 = std::int64_t;
+using uint8 = std::uint8_t;
+using uint16 = std::uint16_t;
+using uint32 = std::uint32_t;
+using uint64 = std::uint64_t;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_INTEGER_HPP

Property changes on: src/mpt/base/integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/macros.hpp
===================================================================
--- src/mpt/base/macros.hpp	(nonexistent)
+++ src/mpt/base/macros.hpp	(working copy)
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_MACROS_HPP
+#define MPT_BASE_MACROS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+
+#include <type_traits>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+// Advanced inline attributes
+#if MPT_COMPILER_MSVC
+#define MPT_FORCEINLINE __forceinline
+#define MPT_NOINLINE    __declspec(noinline)
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#define MPT_FORCEINLINE __attribute__((always_inline)) inline
+#define MPT_NOINLINE    __attribute__((noinline))
+#else
+#define MPT_FORCEINLINE inline
+#define MPT_NOINLINE
+#endif
+
+
+
+// constexpr
+#define MPT_CONSTEXPRINLINE constexpr MPT_FORCEINLINE
+#if MPT_CXX_AT_LEAST(20)
+#define MPT_CONSTEXPR20_FUN constexpr MPT_FORCEINLINE
+#define MPT_CONSTEXPR20_VAR constexpr
+#else // !C++20
+#define MPT_CONSTEXPR20_FUN MPT_FORCEINLINE
+#define MPT_CONSTEXPR20_VAR const
+#endif // C++20
+
+
+
+#define MPT_FORCE_CONSTEXPR(expr) [&]() { \
+	constexpr auto x = (expr); \
+	return x; \
+}()
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+#define MPT_IS_CONSTANT_EVALUATED20() std::is_constant_evaluated()
+#define MPT_IS_CONSTANT_EVALUATED()   std::is_constant_evaluated()
+#else // !C++20
+#define MPT_IS_CONSTANT_EVALUATED20() false
+// this pessimizes the case for C++17 by always assuming constexpr context, which implies always running constexpr-friendly code
+#define MPT_IS_CONSTANT_EVALUATED()   true
+#endif // C++20
+
+
+
+#if MPT_COMPILER_MSVC
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	__pragma(warning(push)) \
+	__pragma(warning(disable : 4127)) \
+	if (x) \
+		__pragma(warning(pop)) \
+/**/
+#endif
+
+#if MPT_COMPILER_GCC
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	_Pragma("GCC diagnostic push") \
+	_Pragma("GCC diagnostic ignored \"-Wtype-limits\"") \
+	if (x) \
+		_Pragma("GCC diagnostic pop") \
+/**/
+#endif
+
+#if MPT_COMPILER_CLANG
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	_Pragma("clang diagnostic push") \
+	_Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") \
+	_Pragma("clang diagnostic ignored \"-Wtype-limits\"") \
+	_Pragma("clang diagnostic ignored \"-Wtautological-constant-out-of-range-compare\"") \
+	if (x) \
+		_Pragma("clang diagnostic pop") \
+/**/
+#endif
+
+#if !defined(MPT_MAYBE_CONSTANT_IF)
+// MPT_MAYBE_CONSTANT_IF disables compiler warnings for conditions that may in some case be either always false or always true (this may turn out to be useful in ASSERTions in some cases).
+#define MPT_MAYBE_CONSTANT_IF(x) if (x)
+#endif
+
+
+
+#if MPT_OS_WINDOWS
+#define MPT_UNUSED(x) UNREFERENCED_PARAMETER(x)
+#else
+#define MPT_UNUSED(x) static_cast<void>(x)
+#endif
+
+
+
+#define MPT_DISCARD(expr) static_cast<void>(expr)
+
+
+
+// Use MPT_RESTRICT to indicate that a pointer is guaranteed to not be aliased.
+#if MPT_COMPILER_MSVC || MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#define MPT_RESTRICT __restrict
+#else
+#define MPT_RESTRICT
+#endif
+
+
+
+#endif // MPT_BASE_MACROS_HPP

Property changes on: src/mpt/base/macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/math.hpp
===================================================================
--- src/mpt/base/math.hpp	(nonexistent)
+++ src/mpt/base/math.hpp	(working copy)
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_EMPTY_HPP
+#define MPT_BASE_EMPTY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <cmath>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_OS_DJGPP
+
+inline double round(const long double val) {
+	return ::roundl(val);
+}
+
+inline double round(const double val) {
+	return ::round(val);
+}
+
+inline float round(const float val) {
+	return ::roundf(val);
+}
+
+#else // !MPT_OS_DJGPP
+
+// C++11 std::round
+using std::round;
+
+#endif // MPT_OS_DJGPP
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_EMPTY_HPP

Property changes on: src/mpt/base/math.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/memory.hpp
===================================================================
--- src/mpt/base/memory.hpp	(nonexistent)
+++ src/mpt/base/memory.hpp	(working copy)
@@ -0,0 +1,262 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_MEMORY_HPP
+#define MPT_BASE_MEMORY_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/span.hpp"
+
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+using byte_span = mpt::span<std::byte>;
+using const_byte_span = mpt::span<const std::byte>;
+
+
+
+// Tell which types are safe for mpt::byte_cast.
+// signed char is actually not allowed to alias into an object representation,
+// which means that, if the actual type is not itself signed char but char or
+// unsigned char instead, dereferencing the signed char pointer is undefined
+// behaviour.
+template <typename T>
+struct is_byte_castable : public std::false_type { };
+template <>
+struct is_byte_castable<char> : public std::true_type { };
+template <>
+struct is_byte_castable<unsigned char> : public std::true_type { };
+template <>
+struct is_byte_castable<std::byte> : public std::true_type { };
+template <>
+struct is_byte_castable<const char> : public std::true_type { };
+template <>
+struct is_byte_castable<const unsigned char> : public std::true_type { };
+template <>
+struct is_byte_castable<const std::byte> : public std::true_type { };
+
+
+template <typename T>
+struct is_byte : public std::false_type { };
+template <>
+struct is_byte<std::byte> : public std::true_type { };
+template <>
+struct is_byte<const std::byte> : public std::true_type { };
+
+
+template <typename T>
+constexpr bool declare_binary_safe(const T &) noexcept {
+	return false;
+}
+
+constexpr bool declare_binary_safe(const char &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8 &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8 &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const std::byte &) noexcept {
+	return true;
+}
+
+// Tell which types are safe to binary write into files.
+// By default, no types are safe.
+// When a safe type gets defined,
+// also specialize this template so that IO functions will work.
+template <typename T>
+struct is_binary_safe : public std::conditional<declare_binary_safe(T{}), std::true_type, std::false_type>::type { };
+
+// Generic Specialization for arrays.
+template <typename T, std::size_t N>
+struct is_binary_safe<T[N]> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<const T[N]> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<std::array<T, N>> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<const std::array<T, N>> : public is_binary_safe<T> { };
+
+
+template <typename T>
+constexpr bool check_binary_size(std::size_t size) noexcept {
+	return true
+		&& (sizeof(T) == size)
+		&& (alignof(T) == 1)
+		&& std::is_standard_layout<T>::value
+		&& std::has_unique_object_representations<T>::value
+		&& mpt::is_binary_safe<T>::value;
+}
+
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl {
+	inline Tdst operator()(Tsrc src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		// not checking is_byte_castable here because we are actually
+		// doing a static_cast and converting the value
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return static_cast<Tdst>(src);
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl<mpt::span<Tdst>, mpt::span<Tsrc>> {
+	inline mpt::span<Tdst> operator()(mpt::span<Tsrc> src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return mpt::as_span(mpt::byte_cast_impl<Tdst *, Tsrc *>()(src.data()), mpt::byte_cast_impl<Tdst *, Tsrc *>()(src.data() + src.size()));
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl<Tdst *, Tsrc *> {
+	inline Tdst * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct void_cast_impl;
+
+template <typename Tdst>
+struct void_cast_impl<Tdst *, void *> {
+	inline Tdst * operator()(void * src) const noexcept {
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tdst>
+struct void_cast_impl<Tdst *, const void *> {
+	inline Tdst * operator()(const void * src) const noexcept {
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tsrc>
+struct void_cast_impl<void *, Tsrc *> {
+	inline void * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		return reinterpret_cast<void *>(src);
+	}
+};
+
+template <typename Tsrc>
+struct void_cast_impl<const void *, Tsrc *> {
+	inline const void * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		return reinterpret_cast<const void *>(src);
+	}
+};
+
+// casts between different byte (char) types or pointers to these types
+template <typename Tdst, typename Tsrc>
+inline Tdst byte_cast(Tsrc src) noexcept {
+	return byte_cast_impl<Tdst, Tsrc>()(src);
+}
+
+// casts between pointers to void and pointers to byte
+template <typename Tdst, typename Tsrc>
+inline Tdst void_cast(Tsrc src) noexcept {
+	return void_cast_impl<Tdst, Tsrc>()(src);
+}
+
+
+
+template <typename T>
+MPT_CONSTEXPRINLINE std::byte as_byte(T src) noexcept {
+	static_assert(std::is_integral<T>::value);
+	return static_cast<std::byte>(static_cast<uint8>(src));
+}
+
+
+
+template <typename T>
+struct as_raw_memory_impl {
+	inline mpt::const_byte_span operator()(const T & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(&v), sizeof(T));
+	}
+	inline mpt::byte_span operator()(T & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(&v), sizeof(T));
+	}
+};
+
+template <typename T, std::size_t N>
+struct as_raw_memory_impl<T[N]> {
+	inline mpt::const_byte_span operator()(const T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v), N * sizeof(T));
+	}
+	inline mpt::byte_span operator()(T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(v), N * sizeof(T));
+	}
+};
+
+template <typename T, std::size_t N>
+struct as_raw_memory_impl<const T[N]> {
+	inline mpt::const_byte_span operator()(const T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v), N * sizeof(T));
+	}
+};
+
+// In order to be able to partially specialize it,
+// as_raw_memory is implemented via a class template.
+// Do not overload or specialize as_raw_memory directly.
+// Using a wrapper (by default just around a cast to const std::byte *),
+// allows for implementing raw memory access
+// via on-demand generating a cached serialized representation.
+template <typename T>
+inline mpt::const_byte_span as_raw_memory(const T & v) {
+	return mpt::as_raw_memory_impl<T>()(v);
+}
+template <typename T>
+inline mpt::byte_span as_raw_memory(T & v) {
+	return mpt::as_raw_memory_impl<T>()(v);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_MEMORY_HPP

Property changes on: src/mpt/base/memory.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/namespace.hpp
===================================================================
--- src/mpt/base/namespace.hpp	(nonexistent)
+++ src/mpt/base/namespace.hpp	(working copy)
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_NAMESPACE_HPP
+#define MPT_BASE_NAMESPACE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/version.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+
+
+#if !defined(MPT_INLINE_NS)
+
+#define MPT_BUILD_VERSION_NAMESPACE_IMPL(a, b, c, d) v##a##_##b##_##c##_##d
+#define MPT_BUILD_VERSION_NAMESPACE(a, b, c, d)      MPT_BUILD_VERSION_NAMESPACE_IMPL(a, b, c, d)
+
+#define MPT_VERSION_NAMESPACE MPT_BUILD_VERSION_NAMESPACE(MPT_VERSION_MAJOR, MPT_VERSION_MINOR, MPT_VERSION_PATCH, MPT_VERSION_BUILD)
+
+#if MPT_OS_WINDOWS
+#ifdef UNICODE
+#define MPT_VERSION_ABI_OS u
+#else
+#define MPT_VERSION_ABI_OS 8
+#endif
+#else
+#define MPT_VERSION_ABI_OS _
+#endif
+
+#if MPT_LIBC_GENERIC
+#define MPT_VERSION_ABI_LIBC _
+#elif MPT_LIBC_MS
+#ifdef _DLL
+#ifdef _DEBUG
+#define MPT_VERSION_ABI_LIBC MDd
+#else
+#define MPT_VERSION_ABI_LIBC MDr
+#endif
+#else
+#ifdef _DEBUG
+#define MPT_VERSION_ABI_LIBC MTd
+#else
+#define MPT_VERSION_ABI_LIBC MTr
+#endif
+#endif
+#elif MPT_LIBC_GLIBC
+#define MPT_VERSION_ABI_LIBC G
+#else
+#define MPT_VERSION_ABI_LIBC _
+#endif
+
+#define MPT_BUILD_ABI_NAMESPACE_IMPL(a, b) ABI_##a##_##b
+#define MPT_BUILD_ABI_NAMESPACE(a, b)      MPT_BUILD_ABI_NAMESPACE_IMPL(a, b)
+
+#define MPT_ABI_NAMESPACE MPT_BUILD_ABI_NAMESPACE(MPT_VERSION_ABI_OS, MPT_VERSION_ABI_LIBC)
+
+#if !defined(MPT_PROJECT_NAMESPACE)
+MPT_WARNING("Please #define MPT_PROJECT_NAMESPACE or #define MPT_INLINE_NS in build configuration.")
+#define MPT_PROJECT_NAMESPACE x
+#endif // !MPT_PROJECT_NAMESPACE
+
+#define MPT_BUILD_INLINE_NS_IMPL(a, b, c) a##_##b##_##c
+#define MPT_BUILD_INLINE_NS(a, b, c)      MPT_BUILD_INLINE_NS_IMPL(a, b, c)
+
+#define MPT_INLINE_NS MPT_BUILD_INLINE_NS(MPT_VERSION_NAMESPACE, MPT_ABI_NAMESPACE, MPT_PROJECT_NAMESPACE)
+
+#endif // !MPT_INLINE_NS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_NAMESPACE_HPP

Property changes on: src/mpt/base/namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/numeric.hpp
===================================================================
--- src/mpt/base/numeric.hpp	(nonexistent)
+++ src/mpt/base/numeric.hpp	(working copy)
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_NUMERIC_HPP
+#define MPT_BASE_NUMERIC_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/saturate_cast.hpp"
+
+#include <algorithm>
+#include <limits>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tmod, Tmod m>
+struct ModIfNotZeroImpl {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		static_assert(std::numeric_limits<Tmod>::is_integer);
+		static_assert(!std::numeric_limits<Tmod>::is_signed);
+		static_assert(std::numeric_limits<Tval>::is_integer);
+		static_assert(!std::numeric_limits<Tval>::is_signed);
+		return static_cast<Tval>(x % m);
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint8, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint16, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint32, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint64, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+
+// Returns x % m if m != 0, x otherwise.
+// i.e. "return (m == 0) ? x : (x % m);", but without causing a warning with stupid older compilers
+template <typename Tmod, Tmod m, typename Tval>
+constexpr Tval modulo_if_not_zero(Tval x) {
+	return ModIfNotZeroImpl<Tmod, m>().mod(x);
+}
+
+// rounds x up to multiples of target
+template <typename T>
+constexpr T align_up(T x, T target) {
+	return ((x + (target - 1)) / target) * target;
+}
+
+// rounds x down to multiples of target
+template <typename T>
+constexpr T align_down(T x, T target) {
+	return (x / target) * target;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALGORITHM_HPP

Property changes on: src/mpt/base/numeric.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/pointer.hpp
===================================================================
--- src/mpt/base/pointer.hpp	(nonexistent)
+++ src/mpt/base/pointer.hpp	(working copy)
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_POINTER_HPP
+#define MPT_BASE_POINTER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+inline constexpr int arch_bits = sizeof(void *) * 8;
+inline constexpr std::size_t pointer_size = sizeof(void *);
+
+
+template <typename Tdst, typename Tsrc>
+struct pointer_cast_helper {
+	static constexpr Tdst cast(const Tsrc & src) noexcept {
+		return src;
+	}
+};
+
+template <typename Tdst, typename Tptr>
+struct pointer_cast_helper<Tdst, const Tptr *> {
+	static constexpr Tdst cast(const Tptr * const & src) noexcept {
+		return reinterpret_cast<const Tdst>(src);
+	}
+};
+template <typename Tdst, typename Tptr>
+struct pointer_cast_helper<Tdst, Tptr *> {
+	static constexpr Tdst cast(const Tptr * const & src) noexcept {
+		return reinterpret_cast<const Tdst>(src);
+	}
+};
+
+
+template <typename Tdst, typename Tsrc>
+constexpr Tdst pointer_cast(const Tsrc & src) noexcept {
+	return pointer_cast_helper<Tdst, Tsrc>::cast(src);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_POINTER_HPP

Property changes on: src/mpt/base/pointer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/preprocessor.hpp
===================================================================
--- src/mpt/base/preprocessor.hpp	(nonexistent)
+++ src/mpt/base/preprocessor.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_PREPROCESSOR_HPP
+#define MPT_BASE_PREPROCESSOR_HPP
+
+
+
+#define MPT_PP_DEFER(m, ...) m(__VA_ARGS__)
+
+#define MPT_PP_STRINGIFY(x) #x
+
+#define MPT_PP_JOIN_HELPER(a, b) a##b
+#define MPT_PP_JOIN(a, b)        MPT_PP_JOIN_HELPER(a, b)
+
+#define MPT_PP_UNIQUE_IDENTIFIER(prefix) MPT_PP_JOIN(prefix, __LINE__)
+
+
+
+#endif // MPT_BASE_PREPROCESSOR_HPP

Property changes on: src/mpt/base/preprocessor.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/saturate_cast.hpp
===================================================================
--- src/mpt/base/saturate_cast.hpp	(nonexistent)
+++ src/mpt/base/saturate_cast.hpp	(working copy)
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SATURATE_CAST_HPP
+#define MPT_BASE_SATURATE_CAST_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Saturate the value of src to the domain of Tdst
+template <typename Tdst, typename Tsrc>
+constexpr Tdst saturate_cast(Tsrc src) noexcept {
+	// This code tries not only to obviously avoid overflows but also to avoid signed/unsigned comparison warnings and type truncation warnings (which in fact would be safe here) by explicit casting.
+	static_assert(std::numeric_limits<Tdst>::is_integer);
+	static_assert(std::numeric_limits<Tsrc>::is_integer);
+	if constexpr (std::numeric_limits<Tdst>::is_signed && std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(std::numeric_limits<Tdst>::min()), std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))));
+		}
+	} else if constexpr (!std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		}
+	} else if constexpr (std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) > sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else if constexpr (sizeof(Tdst) == sizeof(Tsrc)) {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		} else {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		}
+	} else { // Tdst unsigned, Tsrc signed
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(0), src));
+		} else {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(0), std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))));
+		}
+	}
+}
+
+template <typename Tdst>
+constexpr Tdst saturate_cast(double src) {
+	if (src >= static_cast<double>(std::numeric_limits<Tdst>::max())) {
+		return std::numeric_limits<Tdst>::max();
+	}
+	if (src <= static_cast<double>(std::numeric_limits<Tdst>::min())) {
+		return std::numeric_limits<Tdst>::min();
+	}
+	return static_cast<Tdst>(src);
+}
+
+template <typename Tdst>
+constexpr Tdst saturate_cast(float src) {
+	if (src >= static_cast<float>(std::numeric_limits<Tdst>::max())) {
+		return std::numeric_limits<Tdst>::max();
+	}
+	if (src <= static_cast<float>(std::numeric_limits<Tdst>::min())) {
+		return std::numeric_limits<Tdst>::min();
+	}
+	return static_cast<Tdst>(src);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SATURATE_CAST_HPP

Property changes on: src/mpt/base/saturate_cast.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/saturate_round.hpp
===================================================================
--- src/mpt/base/saturate_round.hpp	(nonexistent)
+++ src/mpt/base/saturate_round.hpp	(working copy)
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SATURATE_ROUND_HPP
+#define MPT_BASE_SATURATE_ROUND_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/math.hpp"
+#include "mpt/base/saturate_cast.hpp"
+
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Rounds given double value to nearest integer value of type T.
+// Out-of-range values are saturated to the specified integer type's limits.
+
+template <typename T>
+inline T saturate_round(float val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+template <typename T>
+inline T saturate_round(double val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+template <typename T>
+inline T saturate_round(long double val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SATURATE_ROUND_HPP

Property changes on: src/mpt/base/saturate_round.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/secure.hpp
===================================================================
--- src/mpt/base/secure.hpp	(nonexistent)
+++ src/mpt/base/secure.hpp	(working copy)
@@ -0,0 +1,198 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SECURE_HPP
+#define MPT_BASE_SECURE_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <atomic>
+#include <utility>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace secure {
+
+
+
+inline MPT_NOINLINE void memzero(std::byte * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = static_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(void * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = static_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(char * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = reinterpret_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(uint8 * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = reinterpret_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+
+
+template <typename T>
+inline MPT_NOINLINE void clear(T & val) {
+	std::atomic_signal_fence(std::memory_order_seq_cst);
+	volatile T * volatile v = &val;
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	*v = T{};
+	std::atomic_signal_fence(std::memory_order_seq_cst);
+}
+
+
+
+class byte {
+private:
+	std::byte value;
+
+public:
+	byte() noexcept
+		: value(std::byte{0}) {
+		return;
+	}
+	explicit byte(std::byte value) noexcept
+		: value(value) {
+		return;
+	}
+	byte(const byte & other) noexcept
+		: value(other.value) {
+		return;
+	}
+	byte(byte && other) noexcept
+		: value(std::move(other.value)) {
+		mpt::secure::clear(other.value);
+	}
+	byte & operator=(const byte & other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		value = other.value;
+		return *this;
+	}
+	byte & operator==(byte && other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		value = std::move(other.value);
+		mpt::secure::clear(other.value);
+		return *this;
+	}
+	explicit operator std::byte() const noexcept {
+		return value;
+	}
+	~byte() {
+		mpt::secure::clear(value);
+	}
+};
+
+
+
+class buffer {
+private:
+	std::vector<std::byte> m_data;
+
+public:
+	buffer()
+		: m_data(0) {
+		return;
+	}
+	explicit buffer(const std::vector<std::byte> & data)
+		: m_data(data) {
+		return;
+	}
+	explicit buffer(const std::byte * beg, const std::byte * end)
+		: m_data(beg, end) {
+		return;
+	}
+	buffer(const buffer & other)
+		: m_data(other.m_data) {
+		return;
+	}
+	buffer(buffer && other) noexcept
+		: m_data(std::move(other.m_data)) {
+		mpt::secure::memzero(other.m_data.data(), other.m_data.size());
+	}
+	buffer & operator=(const buffer & other) {
+		if (&other == this) {
+			return *this;
+		}
+		m_data = other.m_data;
+		return *this;
+	}
+	buffer & operator=(buffer && other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		m_data = std::move(other.m_data);
+		mpt::secure::memzero(other.m_data.data(), other.m_data.size());
+		return *this;
+	}
+	~buffer() {
+		mpt::secure::memzero(m_data.data(), m_data.size());
+		m_data.resize(0);
+		m_data.shrink_to_fit();
+	}
+	explicit operator std::vector<std::byte>() const {
+		return m_data;
+	}
+	const std::byte * data() const {
+		return m_data.data();
+	}
+	std::byte * data() {
+		return m_data.data();
+	}
+	std::size_t size() const {
+		return m_data.size();
+	}
+};
+
+
+
+} // namespace secure
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SECURE_HPP

Property changes on: src/mpt/base/secure.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/semantic_version.hpp
===================================================================
--- src/mpt/base/semantic_version.hpp	(nonexistent)
+++ src/mpt/base/semantic_version.hpp	(working copy)
@@ -0,0 +1,94 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SEMANTIC_VERSION_HPP
+#define MPT_BASE_SEMANTIC_VERSION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/version.hpp"
+
+
+
+#include <tuple>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+struct semantic_version {
+	unsigned long long major = 0;
+	unsigned long long minor = 0;
+	unsigned long long patch = 0;
+	constexpr std::tuple<unsigned long long, unsigned long long, unsigned long long> as_tuple() const noexcept {
+		return std::make_tuple(major, minor, patch);
+	}
+};
+
+constexpr bool operator==(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() == b.as_tuple();
+}
+constexpr bool operator!=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() != b.as_tuple();
+}
+constexpr bool operator<(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() < b.as_tuple();
+}
+constexpr bool operator>(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() > b.as_tuple();
+}
+constexpr bool operator<=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() <= b.as_tuple();
+}
+constexpr bool operator>=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() >= b.as_tuple();
+}
+
+struct version_info {
+	semantic_version semver{};
+	unsigned long long build = 0;
+	constexpr std::tuple<std::tuple<unsigned long long, unsigned long long, unsigned long long>, unsigned long long> as_tuple() const noexcept {
+		return std::make_tuple(semver.as_tuple(), build);
+	}
+	template <typename Tostream>
+	friend Tostream & operator<<(Tostream & os, version_info const vi) {
+		if (vi.build > 0) {
+			os << vi.semver.major << "." << vi.semver.minor << "." << vi.semver.patch << "+build." << vi.build;
+		} else {
+			os << vi.semver.major << "." << vi.semver.minor << "." << vi.semver.patch;
+		}
+		return os;
+	}
+};
+
+constexpr bool operator==(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() == b.as_tuple();
+}
+constexpr bool operator!=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() != b.as_tuple();
+}
+constexpr bool operator<(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() < b.as_tuple();
+}
+constexpr bool operator>(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() > b.as_tuple();
+}
+constexpr bool operator<=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() <= b.as_tuple();
+}
+constexpr bool operator>=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() >= b.as_tuple();
+}
+
+constexpr inline version_info Version = {{MPT_VERSION_MAJOR, MPT_VERSION_MINOR, MPT_VERSION_PATCH}, MPT_VERSION_BUILD};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SEMANTIC_VERSION_HPP

Property changes on: src/mpt/base/semantic_version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/source_location.hpp
===================================================================
--- src/mpt/base/source_location.hpp	(nonexistent)
+++ src/mpt/base/source_location.hpp	(working copy)
@@ -0,0 +1,115 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SOURCE_LOCATION_HPP
+#define MPT_BASE_SOURCE_LOCATION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <source_location>
+#endif // C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::source_location;
+
+#define MPT_SOURCE_LOCATION_CURRENT() std::source_location::current()
+
+#else // !C++20
+
+#if MPT_COMPILER_MSVC && MPT_MSVC_AT_LEAST(2019, 6)
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   __builtin_COLUMN()
+
+#elif MPT_COMPILER_GCC
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   0
+
+#elif MPT_COMPILER_CLANG && MPT_CLANG_AT_LEAST(9, 0, 0)
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   __builtin_COLUMN()
+
+#else
+
+#define MPT_SOURCE_LOCATION_FILE     __FILE__
+#define MPT_SOURCE_LOCATION_FUNCTION ""
+#define MPT_SOURCE_LOCATION_LINE     __LINE__
+#define MPT_SOURCE_LOCATION_COLUMN   0
+
+#endif
+
+// compatible with C++20 std::source_location
+struct source_location {
+private:
+	const char * m_file_name;
+	const char * m_function_name;
+	uint32 m_line;
+	uint32 m_column;
+
+public:
+	constexpr source_location() noexcept
+		: m_file_name("")
+		, m_function_name("")
+		, m_line(0)
+		, m_column(0) {
+	}
+	constexpr source_location(const char * file, const char * function, uint32 line, uint32 column) noexcept
+		: m_file_name(file)
+		, m_function_name(function)
+		, m_line(line)
+		, m_column(column) {
+	}
+	source_location(const source_location &) = default;
+	source_location(source_location &&) = default;
+	static constexpr source_location current(const char * file = MPT_SOURCE_LOCATION_FILE, const char * function = MPT_SOURCE_LOCATION_FUNCTION, uint32 line = MPT_SOURCE_LOCATION_LINE, uint32 column = MPT_SOURCE_LOCATION_COLUMN) noexcept {
+		return source_location(file, function, line, column);
+	}
+	constexpr uint32 line() const noexcept {
+		return m_line;
+	}
+	constexpr uint32 column() const noexcept {
+		return m_column;
+	}
+	constexpr const char * file_name() const noexcept {
+		return m_file_name;
+	}
+	constexpr const char * function_name() const noexcept {
+		return m_function_name;
+	}
+};
+
+
+#if (MPT_COMPILER_MSVC && MPT_MSVC_AT_LEAST(2019, 6)) || MPT_COMPILER_GCC || (MPT_COMPILER_CLANG && MPT_CLANG_AT_LEAST(9, 0, 0))
+#define MPT_SOURCE_LOCATION_CURRENT() mpt::source_location::current()
+#else
+#define MPT_SOURCE_LOCATION_CURRENT() mpt::source_location::current(__FILE__, __func__, __LINE__, 0)
+#endif
+
+#endif // C++20
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SOURCE_LOCATION_HPP

Property changes on: src/mpt/base/source_location.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/span.hpp
===================================================================
--- src/mpt/base/span.hpp	(nonexistent)
+++ src/mpt/base/span.hpp	(working copy)
@@ -0,0 +1,213 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SPAN_HPP
+#define MPT_BASE_SPAN_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#if MPT_CXX_AT_LEAST(20)
+#include <span>
+#else // !C++20
+#include <iterator>
+#include <limits>
+#include <type_traits>
+#endif // C++20
+
+#if MPT_CXX_BEFORE(20)
+#include <cstddef>
+#endif // !C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::dynamic_extent;
+using std::span;
+
+#else // !C++20
+
+//  Simplified version of gsl::span.
+//  Non-owning read-only or read-write view into a contiguous block of T
+// objects, i.e. equivalent to a (beg,end) or (data,size) tuple.
+//  Can eventually be replaced without further modifications with a full C++20
+// std::span.
+
+inline constexpr std::size_t dynamic_extent = std::numeric_limits<std::size_t>::max();
+
+template <typename T>
+class span {
+
+public:
+	using element_type = T;
+	using value_type = typename std::remove_cv<T>::type;
+	using index_type = std::size_t;
+	using pointer = T *;
+	using const_pointer = const T *;
+	using reference = T &;
+	using const_reference = const T &;
+
+	using iterator = pointer;
+	using const_iterator = const_pointer;
+
+	using difference_type = typename std::iterator_traits<iterator>::difference_type;
+
+private:
+	T * m_beg;
+	T * m_end;
+
+public:
+	span() noexcept
+		: m_beg(nullptr)
+		, m_end(nullptr) {
+	}
+
+	span(pointer beg, pointer end)
+		: m_beg(beg)
+		, m_end(end) {
+	}
+
+	span(pointer data, index_type size)
+		: m_beg(data)
+		, m_end(data + size) {
+	}
+
+	template <std::size_t N>
+	span(element_type (&arr)[N])
+		: m_beg(arr)
+		, m_end(arr + N) {
+	}
+
+	template <std::size_t N>
+	span(std::array<value_type, N> & arr)
+		: m_beg(arr.data())
+		, m_end(arr.data() + arr.size()) {
+	}
+
+	template <std::size_t N>
+	span(const std::array<value_type, N> & arr)
+		: m_beg(arr.data())
+		, m_end(arr.data() + arr.size()) {
+	}
+
+	span(const span & other) noexcept = default;
+
+	template <typename U>
+	span(const span<U> & other)
+		: m_beg(other.begin())
+		, m_end(other.end()) {
+	}
+
+	span & operator=(const span & other) noexcept = default;
+
+	iterator begin() const {
+		return iterator(m_beg);
+	}
+
+	iterator end() const {
+		return iterator(m_end);
+	}
+
+	const_iterator cbegin() const {
+		return const_iterator(begin());
+	}
+
+	const_iterator cend() const {
+		return const_iterator(end());
+	}
+
+	reference operator[](index_type index) {
+		return at(index);
+	}
+
+	const_reference operator[](index_type index) const {
+		return at(index);
+	}
+
+	bool operator==(span const & other) const noexcept {
+		return size() == other.size() && (m_beg == other.m_beg || std::equal(begin(), end(), other.begin()));
+	}
+
+	bool operator!=(span const & other) const noexcept {
+		return !(*this == other);
+	}
+
+	reference at(index_type index) {
+		return m_beg[index];
+	}
+
+	const_reference at(index_type index) const {
+		return m_beg[index];
+	}
+
+	pointer data() const noexcept {
+		return m_beg;
+	}
+
+	bool empty() const noexcept {
+		return size() == 0;
+	}
+
+	index_type size() const noexcept {
+		return static_cast<index_type>(std::distance(m_beg, m_end));
+	}
+
+	index_type length() const noexcept {
+		return size();
+	}
+
+	span subspan(std::size_t offset, std::size_t count = mpt::dynamic_extent) const {
+		return span(data() + offset, (count == mpt::dynamic_extent) ? (size() - offset) : count);
+	}
+
+	span first(std::size_t count) const {
+		return span(data(), count);
+	}
+
+	span last(std::size_t count) const {
+		return span(data() + (size() - count), count);
+	}
+
+}; // class span
+
+#endif // C++20
+
+template <typename T>
+inline span<T> as_span(T * beg, T * end) {
+	return span<T>(beg, end);
+}
+
+template <typename T>
+inline span<T> as_span(T * data, std::size_t size) {
+	return span<T>(data, size);
+}
+
+template <typename T, std::size_t N>
+inline span<T> as_span(T (&arr)[N]) {
+	return span<T>(std::begin(arr), std::end(arr));
+}
+
+template <typename T, std::size_t N>
+inline span<T> as_span(std::array<T, N> & cont) {
+	return span<T>(cont);
+}
+
+template <typename T, std::size_t N>
+inline span<const T> as_span(const std::array<T, N> & cont) {
+	return span<const T>(cont);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SPAN_HPP

Property changes on: src/mpt/base/span.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_arithmetic_shift.hpp
===================================================================
--- src/mpt/base/tests/tests_base_arithmetic_shift.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_arithmetic_shift.hpp	(working copy)
@@ -0,0 +1,314 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP
+#define MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP
+
+
+
+#include "mpt/base/arithmetic_shift.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_arithmetic_shift{
+	"mpt/base/arithmetic_shift",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 1), mpt::rshift_signed_standard<int16>(-32768, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 1), mpt::rshift_signed_standard<int16>(-32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 1), mpt::rshift_signed_standard<int16>(-32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 1), mpt::rshift_signed_standard<int16>(-2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 1), mpt::rshift_signed_standard<int16>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 1), mpt::rshift_signed_standard<int16>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 1), mpt::rshift_signed_standard<int16>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 1), mpt::rshift_signed_standard<int16>(2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 1), mpt::rshift_signed_standard<int16>(32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 1), mpt::rshift_signed_standard<int16>(32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 14), mpt::rshift_signed_standard<int16>(-32768, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 14), mpt::rshift_signed_standard<int16>(-32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 14), mpt::rshift_signed_standard<int16>(-32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 14), mpt::rshift_signed_standard<int16>(-2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 14), mpt::rshift_signed_standard<int16>(-1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 14), mpt::rshift_signed_standard<int16>(0, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 14), mpt::rshift_signed_standard<int16>(1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 14), mpt::rshift_signed_standard<int16>(2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 14), mpt::rshift_signed_standard<int16>(32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 14), mpt::rshift_signed_standard<int16>(32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 15), mpt::rshift_signed_standard<int16>(-32768, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 15), mpt::rshift_signed_standard<int16>(-32767, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 15), mpt::rshift_signed_standard<int16>(-32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 15), mpt::rshift_signed_standard<int16>(-2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 15), mpt::rshift_signed_standard<int16>(-1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 15), mpt::rshift_signed_standard<int16>(0, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 15), mpt::rshift_signed_standard<int16>(1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 15), mpt::rshift_signed_standard<int16>(2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 15), mpt::rshift_signed_standard<int16>(32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 15), mpt::rshift_signed_standard<int16>(32767, 15));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 1), mpt::lshift_signed_standard<int16>(-32768, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 1), mpt::lshift_signed_standard<int16>(-32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 1), mpt::lshift_signed_standard<int16>(-32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 1), mpt::lshift_signed_standard<int16>(-2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 1), mpt::lshift_signed_standard<int16>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 1), mpt::lshift_signed_standard<int16>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 1), mpt::lshift_signed_standard<int16>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 1), mpt::lshift_signed_standard<int16>(2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 1), mpt::lshift_signed_standard<int16>(32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 1), mpt::lshift_signed_standard<int16>(32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 14), mpt::lshift_signed_standard<int16>(-32768, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 14), mpt::lshift_signed_standard<int16>(-32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 14), mpt::lshift_signed_standard<int16>(-32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 14), mpt::lshift_signed_standard<int16>(-2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 14), mpt::lshift_signed_standard<int16>(-1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 14), mpt::lshift_signed_standard<int16>(0, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 14), mpt::lshift_signed_standard<int16>(1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 14), mpt::lshift_signed_standard<int16>(2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 14), mpt::lshift_signed_standard<int16>(32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 14), mpt::lshift_signed_standard<int16>(32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 15), mpt::lshift_signed_standard<int16>(-32768, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 15), mpt::lshift_signed_standard<int16>(-32767, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 15), mpt::lshift_signed_standard<int16>(-32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 15), mpt::lshift_signed_standard<int16>(-2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 15), mpt::lshift_signed_standard<int16>(-1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 15), mpt::lshift_signed_standard<int16>(0, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 15), mpt::lshift_signed_standard<int16>(1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 15), mpt::lshift_signed_standard<int16>(2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 15), mpt::lshift_signed_standard<int16>(32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 15), mpt::lshift_signed_standard<int16>(32767, 15));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 1), (-32768) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 1), (-32767) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 1), (-32766) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 1), (-2) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 1), (-1) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 1), (0) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 1), (1) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 1), (2) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 1), (32766) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 1), (32767) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 14), (-32768) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 14), (-32767) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 14), (-32766) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 14), (-2) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 14), (-1) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 14), (0) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 14), (1) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 14), (2) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 14), (32766) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 14), (32767) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 15), (-32768) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 15), (-32767) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 15), (-32766) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 15), (-2) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 15), (-1) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 15), (0) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 15), (1) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 15), (2) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 15), (32766) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 15), (32767) >> 15);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 1), (-32768) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 1), (-32767) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 1), (-32766) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 1), (-2) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 1), (-1) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 1), (0) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 1), (1) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 1), (2) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 1), (32766) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 1), (32767) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 14), (-32768) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 14), (-32767) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 14), (-32766) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 14), (-2) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 14), (-1) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 14), (0) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 14), (1) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 14), (2) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 14), (32766) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 14), (32767) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 15), (-32768) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 15), (-32767) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 15), (-32766) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 15), (-2) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 15), (-1) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 15), (0) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 15), (1) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 15), (2) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 15), (32766) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 15), (32767) << 15);
+
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 1), mpt::rshift_signed_standard<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 1), mpt::rshift_signed_standard<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 1), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 1), mpt::rshift_signed_standard<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 1), mpt::rshift_signed_standard<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 1), mpt::rshift_signed_standard<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 1), mpt::rshift_signed_standard<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 1), mpt::rshift_signed_standard<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 31), mpt::rshift_signed_standard<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_standard<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 31), mpt::rshift_signed_standard<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 31), mpt::rshift_signed_standard<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 31), mpt::rshift_signed_standard<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 31), mpt::rshift_signed_standard<int32>(0x7fffffff, 31));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 1), mpt::lshift_signed_standard<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 1), mpt::lshift_signed_standard<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 1), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 1), mpt::lshift_signed_standard<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 1), mpt::lshift_signed_standard<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 1), mpt::lshift_signed_standard<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 1), mpt::lshift_signed_standard<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 1), mpt::lshift_signed_standard<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 31), mpt::lshift_signed_standard<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_standard<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 31), mpt::lshift_signed_standard<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 31), mpt::lshift_signed_standard<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 31), mpt::lshift_signed_standard<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 31), mpt::lshift_signed_standard<int32>(0x7fffffff, 31));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 1), mpt::rshift_signed_undefined<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 1), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 1), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 1), mpt::rshift_signed_undefined<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 1), mpt::rshift_signed_undefined<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 1), mpt::rshift_signed_undefined<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 1), mpt::rshift_signed_undefined<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 1), mpt::rshift_signed_undefined<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 31), mpt::rshift_signed_undefined<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 31), mpt::rshift_signed_undefined<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 31), mpt::rshift_signed_undefined<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 31), mpt::rshift_signed_undefined<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(0x7fffffff, 31));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 1), mpt::lshift_signed_undefined<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 1), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 1), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 1), mpt::lshift_signed_undefined<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 1), mpt::lshift_signed_undefined<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 1), mpt::lshift_signed_undefined<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 1), mpt::lshift_signed_undefined<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 1), mpt::lshift_signed_undefined<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 31), mpt::lshift_signed_undefined<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 31), mpt::lshift_signed_undefined<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 31), mpt::lshift_signed_undefined<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 31), mpt::lshift_signed_undefined<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(0x7fffffff, 31));
+
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::rshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 1), mpt::rshift_signed_standard<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 1), mpt::rshift_signed_standard<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 1), mpt::rshift_signed_standard<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::rshift_signed_standard<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::rshift_signed_standard<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::rshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 63), mpt::rshift_signed_standard<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 63), mpt::rshift_signed_standard<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 63), mpt::rshift_signed_standard<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(0x7fffffffffffffffll, 63));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::lshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 1), mpt::lshift_signed_standard<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 1), mpt::lshift_signed_standard<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 1), mpt::lshift_signed_standard<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::lshift_signed_standard<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::lshift_signed_standard<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::lshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 63), mpt::lshift_signed_standard<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 63), mpt::lshift_signed_standard<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 63), mpt::lshift_signed_standard<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(0x7fffffffffffffffll, 63));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::rshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 1), mpt::rshift_signed_undefined<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 1), mpt::rshift_signed_undefined<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 1), mpt::rshift_signed_undefined<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::rshift_signed_undefined<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::rshift_signed_undefined<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::rshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 63), mpt::rshift_signed_undefined<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 63), mpt::rshift_signed_undefined<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 63), mpt::rshift_signed_undefined<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(0x7fffffffffffffffll, 63));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::lshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 1), mpt::lshift_signed_undefined<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 1), mpt::lshift_signed_undefined<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 1), mpt::lshift_signed_undefined<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::lshift_signed_undefined<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::lshift_signed_undefined<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::lshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 63), mpt::lshift_signed_undefined<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 63), mpt::lshift_signed_undefined<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 63), mpt::lshift_signed_undefined<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(0x7fffffffffffffffll, 63));
+
+#endif
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP

Property changes on: src/mpt/base/tests/tests_base_arithmetic_shift.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_bit.hpp
===================================================================
--- src/mpt/base/tests/tests_base_bit.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_bit.hpp	(working copy)
@@ -0,0 +1,214 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_BASE_BIT_HPP
+#define MPT_BASE_TESTS_BASE_BIT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_bit{
+	"mpt/base/bit",
+	[](mpt::test::context & context) {
+
+#if MPT_CXX_BEFORE(20)
+		MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian_probe());
+#endif
+		MPT_MAYBE_CONSTANT_IF(mpt::endian_is_little()) {
+			MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::little);
+			MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+				MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::little);
+			}
+#if MPT_CXX_BEFORE(20)
+			MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::little);
+#endif
+		}
+		MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big()) {
+			MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::big);
+			MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+				MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::big);
+			}
+#if MPT_CXX_BEFORE(20)
+			MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::big);
+#endif
+		}
+
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(static_cast<uint32>(int32(-1))), 32);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(0u), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(1u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(2u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(3u), 2);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(0u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(1u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(2u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(3u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(4u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(5u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(6u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(7u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(8u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(9u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x7fffffffu)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x80000000u)), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x80000001u)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0xfffffffeu)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0xffffffffu)), false);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(0u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(3u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(4u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(5u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(6u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(7u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(8u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(9u), 16u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x7fffffffu)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x80000000u)), 0x80000000u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x80000001u)), 0u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0xfffffffeu)), 0u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0xffffffffu)), 0u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(0u), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(3u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(4u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(5u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(6u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(7u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(8u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(9u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x7fffffffu)), 0x40000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x80000000u)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x80000001u)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xfffffffeu)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xffffffffu)), 0x80000000u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(0u), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(3u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(4u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(5u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(6u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(7u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(8u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(9u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x7fffffffu)), 31u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000000u)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000001u)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xfffffffeu)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xffffffffu)), 32u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000001)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000011)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00001111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00011111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b01111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111111)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111110)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111100)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111000)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11110000)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11100000)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11000000)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b10000000)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000001)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000011)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000111)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00001111)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00011111)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00111111)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b01111111)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111110)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111100)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11110000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11100000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b10000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000001)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000011)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000111)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00001111)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00011111)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00111111)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b01111111)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111111)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111110)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111100)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11110000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11100000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b10000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000001)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000011)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00001111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00011111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b01111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111110)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111100)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111000)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11110000)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11100000)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11000000)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b10000000)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0xffffffffu), 32);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0xfffffffeu), 31);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x80000000u), 31);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x7fffffffu), 31);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x7ffffffeu), 30);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000007u), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000006u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000005u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000004u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000003u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000002u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000001u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000000u), 0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_BASE_BIT_HPP

Property changes on: src/mpt/base/tests/tests_base_bit.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_math.hpp
===================================================================
--- src/mpt/base/tests/tests_base_math.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_math.hpp	(working copy)
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_MATH_HPP
+#define MPT_BASE_TESTS_MATH_HPP
+
+
+
+#include "mpt/base/math.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_math{
+	"mpt/base/math",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.99), 2.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.5), 2.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.1), 1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.1), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.5), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.9), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-1.4), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-1.7), -2.0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_MATH_HPP

Property changes on: src/mpt/base/tests/tests_base_math.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_saturate_cast.hpp
===================================================================
--- src/mpt/base/tests/tests_base_saturate_cast.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_saturate_cast.hpp	(working copy)
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_SATURATE_CAST_HPP
+#define MPT_BASE_TESTS_SATURATE_CAST_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_saturate_cast{
+	"mpt/base/saturate_cast",
+	[](mpt::test::context & context) {
+		// trivials
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(-1), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(0), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(1), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(std::numeric_limits<int>::min()), std::numeric_limits<int>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(std::numeric_limits<int>::max()), std::numeric_limits<int>::max());
+
+		// signed / unsigned
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<uint16>::min()), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<uint16>::max()), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint32>::min()), (int32)std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint32>::max()), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int64>(std::numeric_limits<uint64>::min()), (int64)std::numeric_limits<uint64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int64>(std::numeric_limits<uint64>::max()), std::numeric_limits<int64>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min()), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max()), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min()), std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max()), (uint32)std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint64>(std::numeric_limits<int64>::min()), std::numeric_limits<uint64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint64>(std::numeric_limits<int64>::max()), (uint64)std::numeric_limits<int64>::max());
+
+		// overflow
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<int16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<int16>::max() + 1), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<int32>::max() + int64(1)), std::numeric_limits<int32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max() + 1), (uint16)std::numeric_limits<int16>::max() + 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max() + int64(1)), (uint32)std::numeric_limits<int32>::max() + 1);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(int16(32000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(int16(-32000)), -128);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(uint16(32000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(uint16(64000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(int16(32000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(int16(-32000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(uint16(32000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(uint16(64000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(int16(-32000)), -32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(uint16(64000)), 32767);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(int16(-32000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(uint16(64000)), 64000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(int16(-32000)), -32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(uint16(64000)), 64000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(int16(32000)), 32000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(int16(-32000)), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(uint16(32000)), 32000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(uint16(64000)), 64000u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int64>::max() - 1), std::numeric_limits<uint32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint64>::max() - 1), std::numeric_limits<int32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(static_cast<double>(std::numeric_limits<int64>::max())), std::numeric_limits<uint32>::max());
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_SATURATE_CAST_HPP

Property changes on: src/mpt/base/tests/tests_base_saturate_cast.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_saturate_round.hpp
===================================================================
--- src/mpt/base/tests/tests_base_saturate_round.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_saturate_round.hpp	(working copy)
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_SATURATE_ROUND_HPP
+#define MPT_BASE_TESTS_SATURATE_ROUND_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_round.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_saturate_round{
+	"mpt/base/saturate_round",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::max() + 0.1), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::max() - 0.4), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::min() + 0.1), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::min() - 0.1), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<uint32>(std::numeric_limits<uint32>::max() + 0.499), std::numeric_limits<uint32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(110.1), 110);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(-110.1), -110);
+
+		// These should fail to compile
+		//mpt::saturate_round<std::string>(1.0);
+		//mpt::saturate_round<int64>(1.0);
+		//mpt::saturate_round<uint64>(1.0);
+
+		// This should trigger assert in Round.
+		//MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(-129), 0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_SATURATE_ROUND_HPP

Property changes on: src/mpt/base/tests/tests_base_saturate_round.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_wrapping_divide.hpp
===================================================================
--- src/mpt/base/tests/tests_base_wrapping_divide.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_wrapping_divide.hpp	(working copy)
@@ -0,0 +1,163 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP
+#define MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/wrapping_divide.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_wrapping_divide{
+	"mpt/base/wrapping_divide",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-25, 12), 11);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-24, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-23, 12), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-8, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-7, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-6, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-5, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-4, 7), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-3, 7), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-2, 7), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-1, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(0, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(0, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(1, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(2, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(3, 7), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(4, 7), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(5, 7), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(6, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(7, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(8, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(23, 12), 11);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(24, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(25, 12), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(uint32(0x7fffffff), uint32(0x80000000)), uint32(0x7fffffff));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0x7ffffffe), int32(0x7fffffff)), int32(0x7ffffffe));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(2)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(2)), int32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(2)), int32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7fffffff)), int32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7fffffff)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7fffffff)), int32(1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffe)), int32(0x7ffffffc));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7ffffffe)), int32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7ffffffe)), int32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffd)), int32(0x7ffffffa));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7ffffffd)), int32(0x7ffffffb));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7ffffffd)), int32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), int32(0x7fffffff)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7fffffff)), int32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7fffffff)), int32(0x7ffffffd));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), int32(0x7ffffffe)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7ffffffe)), int32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7ffffffe)), int32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(2)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(2)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(2)), uint32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x40000001), uint32(0xffffffff)), uint32(0xbffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x40000000), uint32(0xffffffff)), uint32(0xbfffffff));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x3fffffff), uint32(0xffffffff)), uint32(0xc0000000));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000000)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000000)), uint32(2));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000001)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000001)), uint32(2));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000001)), uint32(3));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000000)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000000)), uint32(2));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7fffffff)), uint32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7fffffff)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7fffffff)), uint32(1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffe)), uint32(0x7ffffffc));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7ffffffe)), uint32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7ffffffe)), uint32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffd)), uint32(0x7ffffffa));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7ffffffd)), uint32(0x7ffffffb));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7ffffffd)), uint32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), uint32(0x7fffffff)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7fffffff)), uint32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7fffffff)), uint32(0x7ffffffd));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), uint32(0x7ffffffe)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7ffffffe)), uint32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7ffffffe)), uint32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-15, 7), -3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-14, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-13, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-12, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-11, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-10, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-9, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-8, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-7, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-6, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-5, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-4, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-3, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-2, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-1, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(0, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(1, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(2, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(3, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(4, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(5, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(6, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(7, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(8, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(9, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(10, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(11, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(12, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(13, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(14, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(15, 7), 2);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP

Property changes on: src/mpt/base/tests/tests_base_wrapping_divide.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/utility.hpp
===================================================================
--- src/mpt/base/utility.hpp	(nonexistent)
+++ src/mpt/base/utility.hpp	(working copy)
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_UTILITY_HPP
+#define MPT_BASE_UTILITY_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_CXX_BEFORE(20)
+#include "mpt/base/saturate_cast.hpp"
+#endif
+
+#include <type_traits>
+#include <utility>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::in_range;
+
+#else
+
+// Returns true iff Tdst can represent the value val.
+// Use as if(mpt::in_range<uint8>(-1)).
+template <typename Tdst, typename Tsrc>
+constexpr bool in_range(Tsrc val) {
+	return (static_cast<Tsrc>(mpt::saturate_cast<Tdst>(val)) == val);
+}
+
+#endif
+
+
+#if MPT_CXX_AT_LEAST(23)
+
+using std::to_underlying;
+
+#else
+
+template <typename T>
+constexpr std::underlying_type_t<T> to_underlying(T value) noexcept {
+	return static_cast<typename std::underlying_type<T>::type>(value);
+}
+
+#endif
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_UTILITY_HPP

Property changes on: src/mpt/base/utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/version.hpp
===================================================================
--- src/mpt/base/version.hpp	(nonexistent)
+++ src/mpt/base/version.hpp	(working copy)
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_VERSION_HPP
+#define MPT_BASE_VERSION_HPP
+
+
+
+#define MPT_VERSION_MAJOR 0
+#define MPT_VERSION_MINOR 0
+#define MPT_VERSION_PATCH 0
+#define MPT_VERSION_BUILD 0
+
+
+
+#endif // MPT_BASE_VERSION_HPP

Property changes on: src/mpt/base/version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/wrapping_divide.hpp
===================================================================
--- src/mpt/base/wrapping_divide.hpp	(nonexistent)
+++ src/mpt/base/wrapping_divide.hpp	(working copy)
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_WRAPPING_DIVIDE_HPP
+#define MPT_BASE_WRAPPING_DIVIDE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Modulo with more intuitive behaviour for some contexts:
+// Instead of being symmetrical around 0, the pattern for positive numbers is repeated in the negative range.
+// For example, wrapping_modulo(-1, m) == (m - 1).
+// Behaviour is undefined if m<=0.
+template <typename T, typename M>
+constexpr auto wrapping_modulo(T x, M m) -> decltype(x % m) {
+	return (x >= 0) ? (x % m) : (m - 1 - ((-1 - x) % m));
+}
+
+template <typename T, typename D>
+constexpr auto wrapping_divide(T x, D d) -> decltype(x / d) {
+	return (x >= 0) ? (x / d) : (((x + 1) / d) - 1);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_WRAPPING_DIVIDE_HPP

Property changes on: src/mpt/base/wrapping_divide.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/base64.hpp
===================================================================
--- src/mpt/binary/base64.hpp	(nonexistent)
+++ src/mpt/binary/base64.hpp	(working copy)
@@ -0,0 +1,136 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_BASE64_HPP
+#define MPT_BINARY_BASE64_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class base64_parse_error : public std::runtime_error {
+public:
+	base64_parse_error()
+		: std::runtime_error("invalid Base64 encoding") {
+	}
+};
+
+
+inline constexpr std::array<mpt::uchar, 64> base64 = {
+	{MPT_UCHAR('A'), MPT_UCHAR('B'), MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F'), MPT_UCHAR('G'), MPT_UCHAR('H'), MPT_UCHAR('I'), MPT_UCHAR('J'), MPT_UCHAR('K'), MPT_UCHAR('L'), MPT_UCHAR('M'), MPT_UCHAR('N'), MPT_UCHAR('O'), MPT_UCHAR('P'),
+	 MPT_UCHAR('Q'), MPT_UCHAR('R'), MPT_UCHAR('S'), MPT_UCHAR('T'), MPT_UCHAR('U'), MPT_UCHAR('V'), MPT_UCHAR('W'), MPT_UCHAR('X'), MPT_UCHAR('Y'), MPT_UCHAR('Z'), MPT_UCHAR('a'), MPT_UCHAR('b'), MPT_UCHAR('c'), MPT_UCHAR('d'), MPT_UCHAR('e'), MPT_UCHAR('f'),
+	 MPT_UCHAR('g'), MPT_UCHAR('h'), MPT_UCHAR('i'), MPT_UCHAR('j'), MPT_UCHAR('k'), MPT_UCHAR('l'), MPT_UCHAR('m'), MPT_UCHAR('n'), MPT_UCHAR('o'), MPT_UCHAR('p'), MPT_UCHAR('q'), MPT_UCHAR('r'), MPT_UCHAR('s'), MPT_UCHAR('t'), MPT_UCHAR('u'), MPT_UCHAR('v'),
+	 MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('+'), MPT_UCHAR('/')}};
+
+
+template <typename Tbyte>
+inline mpt::ustring encode_base64(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(4 * ((src.size() + 2) / 3));
+	uint32 bits = 0;
+	std::size_t bytes = 0;
+	for (std::byte byte : src) {
+		bits <<= 8;
+		bits |= mpt::byte_cast<uint8>(byte);
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64[(bits >> 18) & 0x3f]);
+			result.push_back(base64[(bits >> 12) & 0x3f]);
+			result.push_back(base64[(bits >> 6) & 0x3f]);
+			result.push_back(base64[(bits >> 0) & 0x3f]);
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	std::size_t padding = 0;
+	while (bytes != 0) {
+		bits <<= 8;
+		padding++;
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64[(bits >> 18) & 0x3f]);
+			result.push_back(base64[(bits >> 12) & 0x3f]);
+			if (padding > 1) {
+				result.push_back(MPT_UCHAR('='));
+			} else {
+				result.push_back(base64[(bits >> 6) & 0x3f]);
+			}
+			if (padding > 0) {
+				result.push_back(MPT_UCHAR('='));
+			} else {
+				result.push_back(base64[(bits >> 0) & 0x3f]);
+			}
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	return result;
+}
+
+inline uint8 decode_base64_bits(mpt::uchar c) {
+	for (uint8 i = 0; i < 64; ++i) {
+		if (base64[i] == c) {
+			return i;
+		}
+	}
+	throw base64_parse_error();
+}
+
+
+inline std::vector<std::byte> decode_base64(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(3 * (src.length() / 4));
+	uint32 bits = 0;
+	std::size_t chars = 0;
+	std::size_t padding = 0;
+	for (mpt::uchar c : src) {
+		bits <<= 6;
+		if (c == MPT_UCHAR('=')) {
+			padding++;
+		} else {
+			bits |= decode_base64_bits(c);
+		}
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			if (padding < 2) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			}
+			if (padding < 1) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			}
+			bits = 0;
+			chars = 0;
+			padding = 0;
+		}
+	}
+	if (chars != 0) {
+		throw base64_parse_error();
+	}
+	return result;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_BASE64_HPP

Property changes on: src/mpt/binary/base64.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/base64url.hpp
===================================================================
--- src/mpt/binary/base64url.hpp	(nonexistent)
+++ src/mpt/binary/base64url.hpp	(working copy)
@@ -0,0 +1,139 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_BASE64URL_HPP
+#define MPT_BINARY_BASE64URL_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class base64url_parse_error : public std::runtime_error {
+public:
+	base64url_parse_error()
+		: std::runtime_error("invalid Base64URL encoding") {
+	}
+};
+
+
+inline constexpr std::array<mpt::uchar, 64> base64url = {
+	{MPT_UCHAR('A'), MPT_UCHAR('B'), MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F'), MPT_UCHAR('G'), MPT_UCHAR('H'), MPT_UCHAR('I'), MPT_UCHAR('J'), MPT_UCHAR('K'), MPT_UCHAR('L'), MPT_UCHAR('M'), MPT_UCHAR('N'), MPT_UCHAR('O'), MPT_UCHAR('P'),
+	 MPT_UCHAR('Q'), MPT_UCHAR('R'), MPT_UCHAR('S'), MPT_UCHAR('T'), MPT_UCHAR('U'), MPT_UCHAR('V'), MPT_UCHAR('W'), MPT_UCHAR('X'), MPT_UCHAR('Y'), MPT_UCHAR('Z'), MPT_UCHAR('a'), MPT_UCHAR('b'), MPT_UCHAR('c'), MPT_UCHAR('d'), MPT_UCHAR('e'), MPT_UCHAR('f'),
+	 MPT_UCHAR('g'), MPT_UCHAR('h'), MPT_UCHAR('i'), MPT_UCHAR('j'), MPT_UCHAR('k'), MPT_UCHAR('l'), MPT_UCHAR('m'), MPT_UCHAR('n'), MPT_UCHAR('o'), MPT_UCHAR('p'), MPT_UCHAR('q'), MPT_UCHAR('r'), MPT_UCHAR('s'), MPT_UCHAR('t'), MPT_UCHAR('u'), MPT_UCHAR('v'),
+	 MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('-'), MPT_UCHAR('_')}};
+
+template <typename Tbyte>
+inline mpt::ustring encode_base64url(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(4 * ((src.size() + 2) / 3));
+	uint32 bits = 0;
+	std::size_t bytes = 0;
+	for (std::byte byte : src) {
+		bits <<= 8;
+		bits |= mpt::byte_cast<uint8>(byte);
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64url[(bits >> 18) & 0x3f]);
+			result.push_back(base64url[(bits >> 12) & 0x3f]);
+			result.push_back(base64url[(bits >> 6) & 0x3f]);
+			result.push_back(base64url[(bits >> 0) & 0x3f]);
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	std::size_t padding = 0;
+	while (bytes != 0) {
+		bits <<= 8;
+		padding++;
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64url[(bits >> 18) & 0x3f]);
+			result.push_back(base64url[(bits >> 12) & 0x3f]);
+			if (padding <= 1) {
+				result.push_back(base64url[(bits >> 6) & 0x3f]);
+			}
+			if (padding <= 0) {
+				result.push_back(base64url[(bits >> 0) & 0x3f]);
+			}
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	return result;
+}
+
+inline uint8 decode_base64url_bits(mpt::uchar c) {
+	for (uint8 i = 0; i < 64; ++i)
+	{
+		if (base64url[i] == c)
+		{
+			return i;
+		}
+	}
+	throw base64url_parse_error();
+}
+
+inline std::vector<std::byte> decode_base64url(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(3 * ((src.length() + 2) / 4));
+	uint32 bits = 0;
+	std::size_t chars = 0;
+	for (mpt::uchar c : src) {
+		bits <<= 6;
+		bits |= decode_base64url_bits(c);
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			bits = 0;
+			chars = 0;
+		}
+	}
+	uint32 padding = 0;
+	if (chars != 0 && chars < 2) {
+		throw base64url_parse_error();
+	}
+	while (chars != 0) {
+		bits <<= 6;
+		padding++;
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			if (padding < 2) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			}
+			if (padding < 1) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			}
+			bits = 0;
+			chars = 0;
+			padding = 0;
+		}
+	}
+	return result;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_BASE64URL_HPP

Property changes on: src/mpt/binary/base64url.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/hex.hpp
===================================================================
--- src/mpt/binary/hex.hpp	(nonexistent)
+++ src/mpt/binary/hex.hpp	(working copy)
@@ -0,0 +1,88 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_HEX_HPP
+#define MPT_BINARY_HEX_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline constexpr std::array<mpt::uchar, 16> encode_nibble = {
+	{MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'),
+	 MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'),
+	 MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('A'), MPT_UCHAR('B'),
+	 MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F')}};
+
+
+inline bool decode_byte(uint8 & byte, mpt::uchar c1, mpt::uchar c2) {
+	byte = 0;
+	if (MPT_UCHAR('0') <= c1 && c1 <= MPT_UCHAR('9')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('0')) << 4);
+	} else if (MPT_UCHAR('A') <= c1 && c1 <= MPT_UCHAR('F')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('A') + 10) << 4);
+	} else if (MPT_UCHAR('a') <= c1 && c1 <= MPT_UCHAR('f')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('a') + 10) << 4);
+	} else {
+		return false;
+	}
+	if (MPT_UCHAR('0') <= c2 && c2 <= MPT_UCHAR('9')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('0'));
+	} else if (MPT_UCHAR('A') <= c2 && c2 <= MPT_UCHAR('F')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('A') + 10);
+	} else if (MPT_UCHAR('a') <= c2 && c2 <= MPT_UCHAR('f')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('a') + 10);
+	} else {
+		return false;
+	}
+	return true;
+}
+
+
+template <typename Tbyte>
+inline mpt::ustring encode_hex(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(src.size() * 2);
+	for (std::byte byte : src) {
+		result.push_back(encode_nibble[(mpt::byte_cast<uint8>(byte) & 0xf0) >> 4]);
+		result.push_back(encode_nibble[mpt::byte_cast<uint8>(byte) & 0x0f]);
+	}
+	return result;
+}
+
+inline std::vector<std::byte> decode_hex(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(src.size() / 2);
+	for (std::size_t i = 0; (i + 1) < src.size(); i += 2) {
+		uint8 byte = 0;
+		if (!decode_byte(byte, src[i], src[i + 1])) {
+			return result;
+		}
+		result.push_back(mpt::byte_cast<std::byte>(byte));
+	}
+	return result;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_HEX_HPP

Property changes on: src/mpt/binary/hex.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/tests/tests_binary.hpp
===================================================================
--- src/mpt/binary/tests/tests_binary.hpp	(nonexistent)
+++ src/mpt/binary/tests/tests_binary.hpp	(working copy)
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_BINARY_HPP
+#define MPT_BASE_TESTS_BINARY_HPP
+
+
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/binary/base64.hpp"
+#include "mpt/binary/base64url.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_binary{
+	"mpt/binary",
+	[](mpt::test::context & context) {
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("cGxlYXN1cmUu"));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("bGVhc3VyZS4="));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("ZWFzdXJlLg=="));
+		}
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("cGxlYXN1cmUu")));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("bGVhc3VyZS4=")));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("ZWFzdXJlLg==")));
+		}
+
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("cGxlYXN1cmUu"));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("bGVhc3VyZS4"));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("ZWFzdXJlLg"));
+		}
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("cGxlYXN1cmUu")));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("bGVhc3VyZS4")));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("ZWFzdXJlLg")));
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_BINARY_HPP

Property changes on: src/mpt/binary/tests/tests_binary.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/libc.hpp
===================================================================
--- src/mpt/check/libc.hpp	(nonexistent)
+++ src/mpt/check/libc.hpp	(working copy)
@@ -0,0 +1,41 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_LIBC_HPP
+#define MPT_CHECK_LIBC_HPP
+
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+#ifndef __STDC_CONSTANT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_CONSTANT_MACROS
+MPT_WARNING("C stdlib does not provide constant macros. Please #define __STDC_CONSTANT_MACROS.")
+#endif
+#endif
+
+#ifndef __STDC_FORMAT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_FORMAT_MACROS
+MPT_WARNING("C stdlib does not provide limit macros. Please #define __STDC_FORMAT_MACROS.")
+#endif
+#endif
+
+#ifndef __STDC_LIMIT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_LIMIT_MACROS
+MPT_WARNING("C stdlib does not provide limit macros. Please #define __STDC_LIMIT_MACROS.")
+#endif
+#endif
+
+#ifndef _USE_MATH_DEFINES
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_USE_MATH_DEFINES
+MPT_WARNING("C stdlib does not provide math constants. Please #define _USE_MATH_DEFINES.")
+#endif
+#endif
+
+#if !MPT_LIBC_MS
+#if !defined(_FILE_OFFSET_BITS)
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_FILE_OFFSET_BITS
+MPT_WARNING("C stdlib may not provide 64bit std::FILE access. Please #define _FILE_OFFSET_BITS=64.")
+#endif
+#endif
+#endif
+
+#endif // MPT_CHECK_LIBC_HPP

Property changes on: src/mpt/check/libc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/mfc.hpp
===================================================================
--- src/mpt/check/mfc.hpp	(nonexistent)
+++ src/mpt/check/mfc.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_MFC_HPP
+#define MPT_CHECK_MFC_HPP
+
+#include "mpt/base/compiletime_warning.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#if MPT_DETECTED_MFC
+
+#ifndef _CSTRING_DISABLE_NARROW_WIDE_CONVERSION
+#ifndef MPT_CHECK_MFC_IGNORE_WARNING_NO_CSTRING_DISABLE_NARROW_WIDE_CONVERSION
+MPT_WARNING("MFC uses CString with automatic encoding conversions. Please #define _CSTRING_DISABLE_NARROW_WIDE_CONVERSION.")
+#endif
+#endif
+
+#endif // MPT_DETECTED_MFC
+
+#endif // MPT_CHECK_MFC_HPP

Property changes on: src/mpt/check/mfc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/windows.hpp
===================================================================
--- src/mpt/check/windows.hpp	(nonexistent)
+++ src/mpt/check/windows.hpp	(working copy)
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_WINDOWS_HPP
+#define MPT_CHECK_WINDOWS_HPP
+
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+#if MPT_OS_WINDOWS
+
+#ifndef UNICODE
+#ifndef MPT_CHECK_WINDOWS_IGNORE_WARNING_NO_UNICODE
+MPT_WARNING("windows.h uses MBCS TCHAR. Please #define UNICODE.")
+#endif
+#endif
+
+#ifndef NOMINMAX
+#ifndef MPT_CHECK_WINDOWS_IGNORE_WARNING_NO_NOMINMAX
+MPT_WARNING("windows.h defines min and max which conflicts with C++. Please #define NOMINMAX.")
+#endif
+#endif
+
+#endif // MPT_OS_WINDOWS
+
+#endif // MPT_CHECK_WINDOWS_HPP

Property changes on: src/mpt/check/windows.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crc/crc.hpp
===================================================================
--- src/mpt/crc/crc.hpp	(nonexistent)
+++ src/mpt/crc/crc.hpp	(working copy)
@@ -0,0 +1,205 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRC_CRC_HPP
+#define MPT_CRC_CRC_HPP
+
+
+
+#include "mpt/base/array.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+
+#include <array>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T, T polynomial, T initial, T resultXOR, bool reverseData>
+class crc {
+
+public:
+	using self_type = crc;
+	using value_type = T;
+	using byte_type = uint8;
+
+	static constexpr std::size_t size_bytes = sizeof(value_type);
+	static constexpr std::size_t size_bits = sizeof(value_type) * 8;
+	static constexpr value_type top_bit = static_cast<value_type>(1) << ((sizeof(value_type) * 8) - 1);
+
+private:
+	template <typename Tint>
+	static constexpr Tint reverse(Tint value) noexcept {
+		const std::size_t bits = sizeof(Tint) * 8;
+		Tint result = 0;
+		for (std::size_t i = 0; i < bits; ++i) {
+			result <<= 1;
+			result |= static_cast<Tint>(value & 0x1);
+			value >>= 1;
+		}
+		return result;
+	}
+
+	static constexpr value_type calculate_table_entry(byte_type pos) noexcept {
+		value_type value = 0;
+		value = (static_cast<value_type>(reverseData ? reverse(pos) : pos) << (size_bits - 8));
+		for (std::size_t bit = 0; bit < 8; ++bit) {
+			if (value & top_bit) {
+				value = (value << 1) ^ polynomial;
+			} else {
+				value = (value << 1);
+			}
+		}
+		value = (reverseData ? reverse(value) : value);
+		return value;
+	}
+
+private:
+	static constexpr std::array<value_type, 256> calculate_table() noexcept {
+		std::array<value_type, 256> t = mpt::init_array<value_type, 256>(value_type{});
+		for (std::size_t i = 0; i < 256; ++i) {
+			t[i] = calculate_table_entry(static_cast<byte_type>(i));
+		}
+		return t;
+	}
+
+	static constexpr std::array<value_type, 256> table = calculate_table();
+
+private:
+	constexpr value_type read_table(byte_type pos) const noexcept {
+		return table[pos];
+	}
+
+private:
+	value_type value;
+
+public:
+	constexpr crc() noexcept
+		: value(initial) {
+		return;
+	}
+
+	constexpr void processByte(byte_type byte) noexcept {
+		if constexpr (reverseData) {
+			value = (value >> 8) ^ read_table(static_cast<byte_type>((value & 0xff) ^ byte));
+		} else {
+			value = (value << 8) ^ read_table(static_cast<byte_type>(((value >> (size_bits - 8)) & 0xff) ^ byte));
+		}
+	}
+
+	constexpr value_type result() const noexcept {
+		return (value ^ resultXOR);
+	}
+
+public:
+	constexpr operator value_type() const noexcept {
+		return result();
+	}
+
+	inline crc & process(char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(signed char c) noexcept {
+		processByte(static_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(unsigned char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(std::byte c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	template <typename InputIt>
+	inline crc & process(InputIt beg, InputIt end) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			process(*it);
+		}
+		return *this;
+	}
+
+	template <typename Container>
+	inline crc & process(const Container & data) {
+		operator()(data.begin(), data.end());
+		return *this;
+	}
+
+	inline crc & operator()(char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(signed char c) noexcept {
+		processByte(static_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(unsigned char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(std::byte c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	template <typename InputIt>
+	crc & operator()(InputIt beg, InputIt end) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			operator()(*it);
+		}
+		return *this;
+	}
+
+	template <typename Container>
+	inline crc & operator()(const Container & data) {
+		operator()(data.begin(), data.end());
+		return *this;
+	}
+
+	template <typename InputIt>
+	crc(InputIt beg, InputIt end)
+		: value(initial) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			process(*it);
+		}
+	}
+
+	template <typename Container>
+	inline crc(const Container & data)
+		: value(initial) {
+		process(data.begin(), data.end());
+	}
+};
+
+using crc16 = crc<uint16, 0x8005, 0, 0, true>;
+using crc32 = crc<uint32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true>;
+using crc32_ogg = crc<uint32, 0x04C11DB7, 0, 0, false>;
+using crc32c = crc<uint32, 0x1EDC6F41, 0xFFFFFFFF, 0xFFFFFFFF, true>;
+using crc64_jones = crc<uint64, 0xAD93D23594C935A9ull, 0xFFFFFFFFFFFFFFFFull, 0, true>;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRC_CRC_HPP

Property changes on: src/mpt/crc/crc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crc/tests/tests_crc.hpp
===================================================================
--- src/mpt/crc/tests/tests_crc.hpp	(nonexistent)
+++ src/mpt/crc/tests/tests_crc.hpp	(working copy)
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_CRC_HPP
+#define MPT_BASE_TESTS_CRC_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/crc/crc.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_crc{
+	"mpt/crc",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::crc32(std::string("123456789")), 0xCBF43926u);
+		MPT_TEST_EXPECT_EQUAL(mpt::crc32_ogg(std::string("123456789")), 0x89a1897fu);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_CRC_HPP

Property changes on: src/mpt/crc/tests/tests_crc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/exception.hpp
===================================================================
--- src/mpt/crypto/exception.hpp	(nonexistent)
+++ src/mpt/crypto/exception.hpp	(working copy)
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_EXCEPTION_HPP
+#define MPT_CRYPTO_EXCEPTION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+
+#include <stdexcept>
+
+#if MPT_OS_WINDOWS
+#include <ncrypt.h>
+#include <wincrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS
+
+class exception
+	: public std::runtime_error {
+private:
+	NTSTATUS m_Status;
+
+public:
+	exception(NTSTATUS status)
+		: std::runtime_error("crypto error")
+		, m_Status(status) {
+		return;
+	}
+
+public:
+	NTSTATUS code() const noexcept {
+		return m_Status;
+	}
+};
+
+
+class security_exception
+	: public std::runtime_error {
+private:
+	SECURITY_STATUS m_Status;
+
+public:
+	security_exception(SECURITY_STATUS status)
+		: std::runtime_error("crypto error")
+		, m_Status(status) {
+		return;
+	}
+
+public:
+	SECURITY_STATUS code() const noexcept {
+		return m_Status;
+	}
+};
+
+
+inline void CheckNTSTATUS(NTSTATUS status) {
+	if (status >= 0) {
+		return;
+	} else if (status == STATUS_NO_MEMORY) {
+		mpt::throw_out_of_memory();
+	} else {
+		throw exception(status);
+	}
+}
+
+
+inline void CheckSECURITY_STATUS(SECURITY_STATUS status) {
+	if (status == ERROR_SUCCESS) {
+		return;
+	} else if (status == NTE_NO_MEMORY) {
+		mpt::throw_out_of_memory();
+	} else {
+		throw security_exception(status);
+	}
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace crypto
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_EXCEPTION_HPP

Property changes on: src/mpt/crypto/exception.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/hash.hpp
===================================================================
--- src/mpt/crypto/hash.hpp	(nonexistent)
+++ src/mpt/crypto/hash.hpp	(working copy)
@@ -0,0 +1,180 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_HASH_HPP
+#define MPT_CRYPTO_HASH_HPP
+
+
+
+#include "mpt/base/array.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/crypto/exception.hpp"
+
+#include <algorithm>
+#include <vector>
+
+#include <cassert>
+#include <cstddef>
+
+#if MPT_OS_WINDOWS
+#include <bcrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+namespace hash {
+
+
+struct hash_traits_md5 {
+	static constexpr std::size_t output_bits = 128;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_MD5_ALGORITHM;
+};
+
+struct hash_traits_sha1 {
+	static constexpr std::size_t output_bits = 160;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA1_ALGORITHM;
+};
+
+struct hash_traits_sha256 {
+	static constexpr std::size_t output_bits = 256;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA256_ALGORITHM;
+};
+
+struct hash_traits_sha512 {
+	static constexpr std::size_t output_bits = 512;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA512_ALGORITHM;
+};
+
+template <typename Traits>
+class hash_impl {
+
+public:
+	using traits = Traits;
+
+	using result_type = std::array<std::byte, traits::output_bytes>;
+
+private:
+	BCRYPT_ALG_HANDLE hAlg = NULL;
+	std::vector<BYTE> hashState;
+	std::vector<BYTE> hashResult;
+	BCRYPT_HASH_HANDLE hHash = NULL;
+
+private:
+	void init() {
+		CheckNTSTATUS(BCryptOpenAlgorithmProvider(&hAlg, traits::bcrypt_name, NULL, 0));
+		if (!hAlg) {
+			throw exception(0);
+		}
+		DWORD hashStateSize = 0;
+		DWORD hashStateSizeSize = 0;
+		CheckNTSTATUS(BCryptGetProperty(hAlg, BCRYPT_OBJECT_LENGTH, (PBYTE)&hashStateSize, sizeof(DWORD), &hashStateSizeSize, 0));
+		if (hashStateSizeSize != sizeof(DWORD)) {
+			throw exception(0);
+		}
+		if (hashStateSize <= 0) {
+			throw exception(0);
+		}
+		hashState.resize(hashStateSize);
+		DWORD hashResultSize = 0;
+		DWORD hashResultSizeSize = 0;
+		CheckNTSTATUS(BCryptGetProperty(hAlg, BCRYPT_HASH_LENGTH, (PBYTE)&hashResultSize, sizeof(DWORD), &hashResultSizeSize, 0));
+		if (hashResultSizeSize != sizeof(DWORD)) {
+			throw exception(0);
+		}
+		if (hashResultSize <= 0) {
+			throw exception(0);
+		}
+		if (hashResultSize != mpt::extent<result_type>()) {
+			throw exception(0);
+		}
+		hashResult.resize(hashResultSize);
+		CheckNTSTATUS(BCryptCreateHash(hAlg, &hHash, hashState.data(), hashStateSize, NULL, 0, 0));
+		if (!hHash) {
+			throw exception(0);
+		}
+	}
+
+	void cleanup() {
+		if (hHash) {
+			BCryptDestroyHash(hHash);
+			hHash = NULL;
+		}
+		hashResult.resize(0);
+		hashResult.shrink_to_fit();
+		hashState.resize(0);
+		hashState.shrink_to_fit();
+		if (hAlg) {
+			BCryptCloseAlgorithmProvider(hAlg, 0);
+			hAlg = NULL;
+		}
+	}
+
+public:
+	hash_impl() {
+		try {
+			init();
+		} catch (...) {
+			cleanup();
+			throw;
+		}
+	}
+	hash_impl(const hash_impl &) = delete;
+	hash_impl & operator=(const hash_impl &) = delete;
+	~hash_impl() {
+		cleanup();
+	}
+
+public:
+	hash_impl & process(mpt::const_byte_span data) {
+		CheckNTSTATUS(BCryptHashData(hHash, const_cast<UCHAR *>(mpt::byte_cast<const UCHAR *>(data.data())), mpt::saturate_cast<ULONG>(data.size()), 0));
+		return *this;
+	}
+
+	result_type result() {
+		result_type res = mpt::init_array<std::byte, traits::output_bytes>(std::byte{0});
+		CheckNTSTATUS(BCryptFinishHash(hHash, hashResult.data(), mpt::saturate_cast<ULONG>(hashResult.size()), 0));
+		assert(hashResult.size() == mpt::extent<result_type>());
+		std::transform(hashResult.begin(), hashResult.end(), res.begin(), [](BYTE b) { return mpt::as_byte(b); });
+		return res;
+	}
+};
+
+using MD5 = hash_impl<hash_traits_md5>;
+using SHA1 = hash_impl<hash_traits_sha1>;
+using SHA256 = hash_impl<hash_traits_sha256>;
+using SHA512 = hash_impl<hash_traits_sha512>;
+
+
+} // namespace hash
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace crypto
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_HASH_HPP

Property changes on: src/mpt/crypto/hash.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/jwk.hpp
===================================================================
--- src/mpt/crypto/jwk.hpp	(nonexistent)
+++ src/mpt/crypto/jwk.hpp	(working copy)
@@ -0,0 +1,532 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_JWK_HPP
+#define MPT_CRYPTO_JWK_HPP
+
+
+
+#include "mpt/base/alloc.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/binary/base64url.hpp"
+#include "mpt/crypto/exception.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+#include "mpt/json/json.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <algorithm>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include <cassert>
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+
+#if MPT_OS_WINDOWS
+#include <bcrypt.h>
+#include <ncrypt.h>
+#include <wincrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+
+
+class keystore {
+public:
+	enum class domain
+	{
+		system = 1,
+		user = 2,
+	};
+
+private:
+	NCRYPT_PROV_HANDLE hProv = NULL;
+	domain ProvDomain = domain::user;
+
+private:
+	void cleanup() {
+		if (hProv) {
+			NCryptFreeObject(hProv);
+			hProv = NULL;
+		}
+	}
+
+public:
+	keystore(domain d)
+		: ProvDomain(d) {
+		try {
+			CheckSECURITY_STATUS(NCryptOpenStorageProvider(&hProv, MS_KEY_STORAGE_PROVIDER, 0));
+		} catch (...) {
+			cleanup();
+			throw;
+		}
+	}
+	~keystore() {
+		return;
+	}
+	operator NCRYPT_PROV_HANDLE() {
+		return hProv;
+	}
+	keystore::domain store_domain() const {
+		return ProvDomain;
+	}
+};
+
+
+
+namespace asymmetric {
+
+
+
+class signature_verification_failed
+	: public std::runtime_error {
+public:
+	signature_verification_failed()
+		: std::runtime_error("Signature Verification failed.") {
+		return;
+	}
+};
+
+
+
+inline std::vector<mpt::ustring> jws_get_keynames(const mpt::ustring & jws_) {
+	std::vector<mpt::ustring> result;
+	nlohmann::json jws = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jws_));
+	for (const auto & s : jws["signatures"]) {
+		result.push_back(s["header"]["kid"]);
+	}
+	return result;
+}
+
+
+
+struct RSASSA_PSS_SHA512_traits {
+	using hash_type = mpt::crypto::hash::SHA512;
+	static constexpr const char * jwk_alg = "PS512";
+};
+
+
+
+template <typename Traits = RSASSA_PSS_SHA512_traits, std::size_t keysize = 4096>
+class rsassa_pss {
+
+public:
+	using hash_type = typename Traits::hash_type;
+	static constexpr const char * jwk_alg = Traits::jwk_alg;
+
+	struct public_key_data {
+
+		mpt::ustring name;
+		uint32 length = 0;
+		std::vector<std::byte> public_exp;
+		std::vector<std::byte> modulus;
+
+		std::vector<std::byte> as_cng_blob() const {
+			BCRYPT_RSAKEY_BLOB rsakey_blob{};
+			rsakey_blob.Magic = BCRYPT_RSAPUBLIC_MAGIC;
+			rsakey_blob.BitLength = length;
+			rsakey_blob.cbPublicExp = mpt::saturate_cast<ULONG>(public_exp.size());
+			rsakey_blob.cbModulus = mpt::saturate_cast<ULONG>(modulus.size());
+			std::vector<std::byte> result(sizeof(BCRYPT_RSAKEY_BLOB) + public_exp.size() + modulus.size());
+			std::memcpy(result.data(), &rsakey_blob, sizeof(BCRYPT_RSAKEY_BLOB));
+			std::memcpy(result.data() + sizeof(BCRYPT_RSAKEY_BLOB), public_exp.data(), public_exp.size());
+			std::memcpy(result.data() + sizeof(BCRYPT_RSAKEY_BLOB) + public_exp.size(), modulus.data(), modulus.size());
+			return result;
+		}
+
+		mpt::ustring as_jwk() const {
+			nlohmann::json json = nlohmann::json::object();
+			json["kid"] = name;
+			json["kty"] = "RSA";
+			json["alg"] = jwk_alg;
+			json["use"] = "sig";
+			json["e"] = mpt::encode_base64url(mpt::as_span(public_exp));
+			json["n"] = mpt::encode_base64url(mpt::as_span(modulus));
+			return mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, json.dump());
+		}
+
+		static public_key_data from_jwk(const mpt::ustring & jwk) {
+			public_key_data result;
+			try {
+				nlohmann::json json = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jwk));
+				if (json["kty"] != "RSA") {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				if (json["alg"] != jwk_alg) {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				if (json["use"] != "sig") {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				result.name = json["kid"].get<mpt::ustring>();
+				result.public_exp = mpt::decode_base64url(json["e"]);
+				result.modulus = mpt::decode_base64url(json["n"]);
+				result.length = mpt::saturate_cast<uint32>(result.modulus.size() * 8);
+			} catch (mpt::out_of_memory e) {
+				mpt::rethrow_out_of_memory(e);
+			} catch (...) {
+				throw std::runtime_error("Cannot parse RSA public key JWK.");
+			}
+			return result;
+		}
+
+		static public_key_data from_cng_blob(const mpt::ustring & name, const std::vector<std::byte> & blob) {
+			public_key_data result;
+			BCRYPT_RSAKEY_BLOB rsakey_blob{};
+			if (blob.size() < sizeof(BCRYPT_RSAKEY_BLOB)) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			std::memcpy(&rsakey_blob, blob.data(), sizeof(BCRYPT_RSAKEY_BLOB));
+			if (rsakey_blob.Magic != BCRYPT_RSAPUBLIC_MAGIC) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			if (blob.size() != sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp + rsakey_blob.cbModulus) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			result.name = name;
+			result.length = rsakey_blob.BitLength;
+			result.public_exp = std::vector<std::byte>(blob.data() + sizeof(BCRYPT_RSAKEY_BLOB), blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp);
+			result.modulus = std::vector<std::byte>(blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp, blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp + rsakey_blob.cbModulus);
+			return result;
+		}
+	};
+
+
+
+	static std::vector<public_key_data> parse_jwk_set(const mpt::ustring & jwk_set_) {
+		std::vector<public_key_data> result;
+		nlohmann::json jwk_set = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jwk_set_));
+		for (const auto & k : jwk_set["keys"]) {
+			try {
+				result.push_back(public_key_data::from_jwk(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, k.dump())));
+			} catch (...) {
+				// nothing
+			}
+		}
+		return result;
+	}
+
+
+
+	class public_key {
+
+	private:
+		mpt::ustring name;
+		BCRYPT_ALG_HANDLE hSignAlg = NULL;
+		BCRYPT_KEY_HANDLE hKey = NULL;
+
+	private:
+		void cleanup() {
+			if (hKey) {
+				BCryptDestroyKey(hKey);
+				hKey = NULL;
+			}
+			if (hSignAlg) {
+				BCryptCloseAlgorithmProvider(hSignAlg, 0);
+				hSignAlg = NULL;
+			}
+		}
+
+	public:
+		public_key(const public_key_data & data) {
+			try {
+				name = data.name;
+				CheckNTSTATUS(BCryptOpenAlgorithmProvider(&hSignAlg, BCRYPT_RSA_ALGORITHM, NULL, 0));
+				std::vector<std::byte> blob = data.as_cng_blob();
+				CheckNTSTATUS(BCryptImportKeyPair(hSignAlg, NULL, BCRYPT_RSAPUBLIC_BLOB, &hKey, mpt::byte_cast<UCHAR *>(blob.data()), mpt::saturate_cast<ULONG>(blob.size()), 0));
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		public_key(const public_key & other)
+			: public_key(other.get_public_key_data()) {
+			return;
+		}
+
+		public_key & operator=(const public_key & other) {
+			if (&other == this) {
+				return *this;
+			}
+			public_key copy(other);
+			{
+				using std::swap;
+				swap(copy.name, name);
+				swap(copy.hSignAlg, hSignAlg);
+				swap(copy.hKey, hKey);
+			}
+			return *this;
+		}
+
+		~public_key() {
+			cleanup();
+		}
+
+		mpt::ustring get_name() const {
+			return name;
+		}
+
+		public_key_data get_public_key_data() const {
+			DWORD bytes = 0;
+			CheckNTSTATUS(BCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, 0, &bytes, 0));
+			std::vector<std::byte> blob(bytes);
+			CheckNTSTATUS(BCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, mpt::byte_cast<BYTE *>(blob.data()), mpt::saturate_cast<DWORD>(blob.size()), &bytes, 0));
+			return public_key_data::from_cng_blob(name, blob);
+		}
+
+		void verify_hash(typename hash_type::result_type hash, std::vector<std::byte> signature) {
+			BCRYPT_PSS_PADDING_INFO paddinginfo;
+			paddinginfo.pszAlgId = hash_type::traits::bcrypt_name;
+			paddinginfo.cbSalt = mpt::saturate_cast<ULONG>(hash_type::traits::output_bytes);
+			NTSTATUS result = BCryptVerifySignature(hKey, &paddinginfo, mpt::byte_cast<UCHAR *>(hash.data()), mpt::saturate_cast<ULONG>(hash.size()), mpt::byte_cast<UCHAR *>(signature.data()), mpt::saturate_cast<ULONG>(signature.size()), BCRYPT_PAD_PSS);
+			if (result == 0x00000000 /*STATUS_SUCCESS*/) {
+				return;
+			}
+			if (result == 0xC000A000 /*STATUS_INVALID_SIGNATURE*/) {
+				throw signature_verification_failed();
+			}
+			CheckNTSTATUS(result);
+			throw signature_verification_failed();
+		}
+
+		void verify(mpt::const_byte_span payload, const std::vector<std::byte> & signature) {
+			verify_hash(hash_type().process(payload).result(), signature);
+		}
+
+		std::vector<std::byte> jws_verify(const mpt::ustring & jws_) {
+			nlohmann::json jws = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jws_));
+			std::vector<std::byte> payload = mpt::decode_base64url(jws["payload"]);
+			nlohmann::json jsignature = nlohmann::json::object();
+			bool sigfound = false;
+			for (const auto & s : jws["signatures"]) {
+				if (s["header"]["kid"] == mpt::convert<std::string>(mpt::common_encoding::utf8, name)) {
+					jsignature = s;
+					sigfound = true;
+				}
+			}
+			if (!sigfound) {
+				throw signature_verification_failed();
+			}
+			std::vector<std::byte> protectedheaderraw = mpt::decode_base64url(jsignature["protected"]);
+			std::vector<std::byte> signature = mpt::decode_base64url(jsignature["signature"]);
+			nlohmann::json header = nlohmann::json::parse(mpt::buffer_cast<std::string>(protectedheaderraw));
+			if (header["typ"] != "JWT") {
+				throw signature_verification_failed();
+			}
+			if (header["alg"] != jwk_alg) {
+				throw signature_verification_failed();
+			}
+			verify_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderraw)) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(payload)))))).result(), signature);
+			return payload;
+		}
+
+		std::vector<std::byte> jws_compact_verify(const mpt::ustring & jws) {
+			std::vector<mpt::ustring> parts = mpt::split<mpt::ustring>(jws, MPT_USTRING("."));
+			if (parts.size() != 3) {
+				throw signature_verification_failed();
+			}
+			std::vector<std::byte> protectedheaderraw = mpt::decode_base64url(parts[0]);
+			std::vector<std::byte> payload = mpt::decode_base64url(parts[1]);
+			std::vector<std::byte> signature = mpt::decode_base64url(parts[2]);
+			nlohmann::json header = nlohmann::json::parse(mpt::buffer_cast<std::string>(protectedheaderraw));
+			if (header["typ"] != "JWT") {
+				throw signature_verification_failed();
+			}
+			if (header["alg"] != jwk_alg) {
+				throw signature_verification_failed();
+			}
+			verify_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderraw)) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(payload)))))).result(), signature);
+			return payload;
+		}
+	};
+
+
+
+	static inline void jws_verify_at_least_one(std::vector<public_key> & keys, const std::vector<std::byte> & expectedPayload, const mpt::ustring & signature) {
+		std::vector<mpt::ustring> keynames = mpt::crypto::asymmetric::jws_get_keynames(signature);
+		bool sigchecked = false;
+		for (const auto & keyname : keynames) {
+			for (auto & key : keys) {
+				if (key.get_name() == keyname) {
+					if (expectedPayload != key.jws_verify(signature)) {
+						throw mpt::crypto::asymmetric::signature_verification_failed();
+					}
+					sigchecked = true;
+				}
+			}
+		}
+		if (!sigchecked) {
+			throw mpt::crypto::asymmetric::signature_verification_failed();
+		}
+	}
+
+
+
+	static inline std::vector<std::byte> jws_verify_at_least_one(std::vector<public_key> & keys, const mpt::ustring & signature) {
+		std::vector<mpt::ustring> keynames = mpt::crypto::asymmetric::jws_get_keynames(signature);
+		for (const auto & keyname : keynames) {
+			for (auto & key : keys) {
+				if (key.get_name() == keyname) {
+					return key.jws_verify(signature);
+				}
+			}
+		}
+		throw mpt::crypto::asymmetric::signature_verification_failed();
+	}
+
+
+
+	class managed_private_key {
+
+	private:
+		mpt::ustring name;
+		NCRYPT_KEY_HANDLE hKey = NULL;
+
+	private:
+		void cleanup() {
+			if (hKey) {
+				NCryptFreeObject(hKey);
+				hKey = NULL;
+			}
+		}
+
+	public:
+		managed_private_key() = delete;
+
+		managed_private_key(const managed_private_key &) = delete;
+
+		managed_private_key & operator=(const managed_private_key &) = delete;
+
+		managed_private_key(keystore & keystore) {
+			try {
+				CheckSECURITY_STATUS(NCryptCreatePersistedKey(keystore, &hKey, BCRYPT_RSA_ALGORITHM, NULL, 0, 0));
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		managed_private_key(keystore & keystore, const mpt::ustring & name_)
+			: name(name_) {
+			try {
+				SECURITY_STATUS openKeyStatus = NCryptOpenKey(keystore, &hKey, mpt::convert<std::wstring>(name).c_str(), 0, (keystore.store_domain() == keystore::domain::system ? NCRYPT_MACHINE_KEY_FLAG : 0));
+				if (openKeyStatus == NTE_BAD_KEYSET) {
+					CheckSECURITY_STATUS(NCryptCreatePersistedKey(keystore, &hKey, BCRYPT_RSA_ALGORITHM, mpt::convert<std::wstring>(name).c_str(), 0, (keystore.store_domain() == keystore::domain::system ? NCRYPT_MACHINE_KEY_FLAG : 0)));
+					DWORD length = mpt::saturate_cast<DWORD>(keysize);
+					CheckSECURITY_STATUS(NCryptSetProperty(hKey, NCRYPT_LENGTH_PROPERTY, (PBYTE)&length, mpt::saturate_cast<DWORD>(sizeof(DWORD)), 0));
+					CheckSECURITY_STATUS(NCryptFinalizeKey(hKey, 0));
+				} else {
+					CheckSECURITY_STATUS(openKeyStatus);
+				}
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		~managed_private_key() {
+			cleanup();
+		}
+
+		void destroy() {
+			CheckSECURITY_STATUS(NCryptDeleteKey(hKey, 0));
+			name = mpt::ustring();
+			hKey = NULL;
+		}
+
+	public:
+		public_key_data get_public_key_data() const {
+			DWORD bytes = 0;
+			CheckSECURITY_STATUS(NCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, NULL, 0, &bytes, 0));
+			std::vector<std::byte> blob(bytes);
+			CheckSECURITY_STATUS(NCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, mpt::byte_cast<BYTE *>(blob.data()), mpt::saturate_cast<DWORD>(blob.size()), &bytes, 0));
+			return public_key_data::from_cng_blob(name, blob);
+		}
+
+		std::vector<std::byte> sign_hash(typename hash_type::result_type hash) {
+			BCRYPT_PSS_PADDING_INFO paddinginfo;
+			paddinginfo.pszAlgId = hash_type::traits::bcrypt_name;
+			paddinginfo.cbSalt = mpt::saturate_cast<ULONG>(hash_type::traits::output_bytes);
+			DWORD bytes = 0;
+			CheckSECURITY_STATUS(NCryptSignHash(hKey, &paddinginfo, mpt::byte_cast<BYTE *>(hash.data()), mpt::saturate_cast<DWORD>(hash.size()), NULL, 0, &bytes, BCRYPT_PAD_PSS));
+			std::vector<std::byte> result(bytes);
+			CheckSECURITY_STATUS(NCryptSignHash(hKey, &paddinginfo, mpt::byte_cast<BYTE *>(hash.data()), mpt::saturate_cast<DWORD>(hash.size()), mpt::byte_cast<BYTE *>(result.data()), mpt::saturate_cast<DWORD>(result.size()), &bytes, BCRYPT_PAD_PSS));
+			return result;
+		}
+
+		std::vector<std::byte> sign(mpt::const_byte_span payload) {
+			return sign_hash(hash_type().process(payload).result());
+		}
+
+		mpt::ustring jws_compact_sign(mpt::const_byte_span payload) {
+			nlohmann::json protectedheader = nlohmann::json::object();
+			protectedheader["typ"] = "JWT";
+			protectedheader["alg"] = jwk_alg;
+			std::string protectedheaderstring = protectedheader.dump();
+			std::vector<std::byte> signature = sign_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload))))).result());
+			return mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(signature));
+		}
+
+		mpt::ustring jws_sign(mpt::const_byte_span payload) {
+			nlohmann::json protectedheader = nlohmann::json::object();
+			protectedheader["typ"] = "JWT";
+			protectedheader["alg"] = jwk_alg;
+			std::string protectedheaderstring = protectedheader.dump();
+			nlohmann::json header = nlohmann::json::object();
+			header["kid"] = name;
+			std::vector<std::byte> signature = sign_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload))))).result());
+			nlohmann::json jws = nlohmann::json::object();
+			jws["payload"] = mpt::encode_base64url(payload);
+			jws["signatures"] = nlohmann::json::array();
+			nlohmann::json jsignature = nlohmann::json::object();
+			jsignature["header"] = header;
+			jsignature["protected"] = mpt::encode_base64url(mpt::as_span(protectedheaderstring));
+			jsignature["signature"] = mpt::encode_base64url(mpt::as_span(signature));
+			jws["signatures"].push_back(jsignature);
+			return mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, jws.dump());
+		}
+	};
+
+}; // class rsassa_pss
+
+
+
+} // namespace asymmetric
+
+
+
+#endif // MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+
+
+} // namespace crypto
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_JWK_HPP

Property changes on: src/mpt/crypto/jwk.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/tests/tests_crypto.hpp
===================================================================
--- src/mpt/crypto/tests/tests_crypto.hpp	(nonexistent)
+++ src/mpt/crypto/tests/tests_crypto.hpp	(working copy)
@@ -0,0 +1,94 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_CRYPTO_HPP
+#define MPT_BASE_TESTS_CRYPTO_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/crypto/exception.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/crypto/jwk.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_crypto{
+	"mpt/crypto",
+	[](mpt::test::context & context) {
+
+#if MPT_OS_WINDOWS
+		mpt::crypto::hash::SHA512::result_type sha512_abc{
+			std::byte{0xdd}, std::byte{0xaf}, std::byte{0x35}, std::byte{0xa1}, std::byte{0x93}, std::byte{0x61}, std::byte{0x7a}, std::byte{0xba},
+			std::byte{0xcc}, std::byte{0x41}, std::byte{0x73}, std::byte{0x49}, std::byte{0xae}, std::byte{0x20}, std::byte{0x41}, std::byte{0x31},
+			std::byte{0x12}, std::byte{0xe6}, std::byte{0xfa}, std::byte{0x4e}, std::byte{0x89}, std::byte{0xa9}, std::byte{0x7e}, std::byte{0xa2},
+			std::byte{0x0a}, std::byte{0x9e}, std::byte{0xee}, std::byte{0xe6}, std::byte{0x4b}, std::byte{0x55}, std::byte{0xd3}, std::byte{0x9a},
+			std::byte{0x21}, std::byte{0x92}, std::byte{0x99}, std::byte{0x2a}, std::byte{0x27}, std::byte{0x4f}, std::byte{0xc1}, std::byte{0xa8},
+			std::byte{0x36}, std::byte{0xba}, std::byte{0x3c}, std::byte{0x23}, std::byte{0xa3}, std::byte{0xfe}, std::byte{0xeb}, std::byte{0xbd},
+			std::byte{0x45}, std::byte{0x4d}, std::byte{0x44}, std::byte{0x23}, std::byte{0x64}, std::byte{0x3c}, std::byte{0xe8}, std::byte{0x0e},
+			std::byte{0x2a}, std::byte{0x9a}, std::byte{0xc9}, std::byte{0x4f}, std::byte{0xa5}, std::byte{0x4c}, std::byte{0xa4}, std::byte{0x9f}};
+		MPT_TEST_EXPECT_EQUAL(mpt::crypto::hash::SHA512().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(std::string("abc")))).result(), sha512_abc);
+
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+		{
+
+			std::vector<std::byte> data = {std::byte{0x11}, std::byte{0x12}, std::byte{0x13}, std::byte{0x14}};
+
+			mpt::crypto::keystore keystore(mpt::crypto::keystore::domain::user);
+
+			mpt::crypto::asymmetric::rsassa_pss<>::managed_private_key key(keystore, U_("OpenMPT Test Key 1"));
+
+			auto publickeydata = key.get_public_key_data();
+
+			mpt::crypto::asymmetric::rsassa_pss<>::public_key pk{publickeydata};
+			mpt::crypto::asymmetric::rsassa_pss<>::public_key pk_copy{pk};
+			mpt::ustring jwk = publickeydata.as_jwk();
+
+			std::vector<std::byte> signature = key.sign(mpt::as_span(data));
+			mpt::ustring jws = key.jws_sign(mpt::as_span(data));
+			mpt::ustring jws_compact = key.jws_compact_sign(mpt::as_span(data));
+
+			try {
+				pk.verify(mpt::as_span(data), signature);
+				auto verifieddata1 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_verify(jws);
+				auto verifieddata2 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_compact_verify(jws_compact);
+				MPT_TEST_EXPECT_EQUAL(true, true);
+				MPT_TEST_EXPECT_EQUAL(data, verifieddata1);
+				MPT_TEST_EXPECT_EQUAL(data, verifieddata2);
+			} catch (const mpt::crypto::asymmetric::signature_verification_failed &) {
+				MPT_TEST_EXPECT_EQUAL(true, false);
+			}
+
+			key.destroy();
+		}
+
+#endif //  MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_CRYPTO_HPP

Property changes on: src/mpt/crypto/tests/tests_crypto.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/detect/mfc.hpp
===================================================================
--- src/mpt/detect/mfc.hpp	(nonexistent)
+++ src/mpt/detect/mfc.hpp	(working copy)
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_DETECT_MFC_HPP
+#define MPT_DETECT_MFC_HPP
+
+#include "mpt/base/compiletime_warning.hpp"
+
+#if defined(MPT_WITH_MFC)
+#if !__has_include(<afx.h>)
+#error "MPT_WITH_MFC defined but <afx.h> not found."
+#endif
+#if !MPT_COMPILER_GENERIC && !MPT_COMPILER_MSVC && !MPT_COMPILER_CLANG
+MPT_WARNING("Using MFC with unsupported compiler.")
+#endif
+#define MPT_DETECTED_MFC 1
+#else
+#define MPT_DETECTED_MFC 0
+#endif
+
+#endif // MPT_DETECT_MFC_HPP

Property changes on: src/mpt/detect/mfc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/detect/nlohmann_json.hpp
===================================================================
--- src/mpt/detect/nlohmann_json.hpp	(nonexistent)
+++ src/mpt/detect/nlohmann_json.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_DETECT_NLOHMANN_JSON_HPP
+#define MPT_DETECT_NLOHMANN_JSON_HPP
+
+#if defined(MPT_WITH_NLOHMANN_JSON)
+#if !__has_include(<nlohmann/json.hpp>)
+#error "MPT_WITH_NLOHMANN_JSON defined but <nlohmann/json.hpp> not found."
+#endif
+#define MPT_DETECTED_NLOHMANN_JSON 1
+#else
+#if __has_include(<nlohmann/json.hpp>)
+#define MPT_DETECTED_NLOHMANN_JSON 1
+#else
+#define MPT_DETECTED_NLOHMANN_JSON 0
+#endif
+#endif
+
+#endif // MPT_DETECT_NLOHMANN_JSON_HPP

Property changes on: src/mpt/detect/nlohmann_json.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/floatingpoint.hpp
===================================================================
--- src/mpt/endian/floatingpoint.hpp	(nonexistent)
+++ src/mpt/endian/floatingpoint.hpp	(working copy)
@@ -0,0 +1,441 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_FLOATINGPOINT_HPP
+#define MPT_ENDIAN_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/floatingpoint.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+
+#include <cmath>
+#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+// 1.0f --> 0x3f800000u
+MPT_FORCEINLINE uint32 EncodeIEEE754binary32(float32 f) {
+	if constexpr (mpt::float_traits<float32>::is_ieee754_binary32ne) {
+		return mpt::bit_cast<uint32>(f);
+	} else {
+		int e = 0;
+		float m = std::frexp(f, &e);
+		if (e == 0 && std::fabs(m) == 0.0f) {
+			uint32 expo = 0u;
+			uint32 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint32 mant = 0u;
+			uint32 i = 0u;
+			i |= (mant << 0) & 0x007fffffu;
+			i |= (expo << 23) & 0x7f800000u;
+			i |= (sign << 31) & 0x80000000u;
+			return i;
+		} else {
+			uint32 expo = e + 127 - 1;
+			uint32 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint32 mant = static_cast<uint32>(std::fabs(std::ldexp(m, 24)));
+			uint32 i = 0u;
+			i |= (mant << 0) & 0x007fffffu;
+			i |= (expo << 23) & 0x7f800000u;
+			i |= (sign << 31) & 0x80000000u;
+			return i;
+		}
+	}
+}
+
+MPT_FORCEINLINE uint64 EncodeIEEE754binary64(float64 f) {
+	if constexpr (mpt::float_traits<float64>::is_ieee754_binary64ne) {
+		return mpt::bit_cast<uint64>(f);
+	} else {
+		int e = 0;
+		double m = std::frexp(f, &e);
+		if (e == 0 && std::fabs(m) == 0.0) {
+			uint64 expo = 0u;
+			uint64 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint64 mant = 0u;
+			uint64 i = 0u;
+			i |= (mant << 0) & 0x000fffffffffffffull;
+			i |= (expo << 52) & 0x7ff0000000000000ull;
+			i |= (sign << 63) & 0x8000000000000000ull;
+			return i;
+		} else {
+			uint64 expo = static_cast<int64>(e) + 1023 - 1;
+			uint64 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint64 mant = static_cast<uint64>(std::fabs(std::ldexp(m, 53)));
+			uint64 i = 0u;
+			i |= (mant << 0) & 0x000fffffffffffffull;
+			i |= (expo << 52) & 0x7ff0000000000000ull;
+			i |= (sign << 63) & 0x8000000000000000ull;
+			return i;
+		}
+	}
+}
+
+// 0x3f800000u --> 1.0f
+MPT_FORCEINLINE float32 DecodeIEEE754binary32(uint32 i) {
+	if constexpr (mpt::float_traits<float32>::is_ieee754_binary32ne) {
+		return mpt::bit_cast<float32>(i);
+	} else {
+		uint32 mant = (i & 0x007fffffu) >> 0;
+		uint32 expo = (i & 0x7f800000u) >> 23;
+		uint32 sign = (i & 0x80000000u) >> 31;
+		if (expo == 0) {
+			float m = sign ? -static_cast<float>(mant) : static_cast<float>(mant);
+			int e = static_cast<int>(expo) - 127 + 1 - 24;
+			float f = std::ldexp(m, e);
+			return static_cast<float32>(f);
+		} else {
+			mant |= 0x00800000u;
+			float m = sign ? -static_cast<float>(mant) : static_cast<float>(mant);
+			int e = static_cast<int>(expo) - 127 + 1 - 24;
+			float f = std::ldexp(m, e);
+			return static_cast<float32>(f);
+		}
+	}
+}
+
+MPT_FORCEINLINE float64 DecodeIEEE754binary64(uint64 i) {
+	if constexpr (mpt::float_traits<float64>::is_ieee754_binary64ne) {
+		return mpt::bit_cast<float64>(i);
+	} else {
+		uint64 mant = (i & 0x000fffffffffffffull) >> 0;
+		uint64 expo = (i & 0x7ff0000000000000ull) >> 52;
+		uint64 sign = (i & 0x8000000000000000ull) >> 63;
+		if (expo == 0) {
+			double m = sign ? -static_cast<double>(mant) : static_cast<double>(mant);
+			int e = static_cast<int>(expo) - 1023 + 1 - 53;
+			double f = std::ldexp(m, e);
+			return static_cast<float64>(f);
+		} else {
+			mant |= 0x0010000000000000ull;
+			double m = sign ? -static_cast<double>(mant) : static_cast<double>(mant);
+			int e = static_cast<int>(expo) - 1023 + 1 - 53;
+			double f = std::ldexp(m, e);
+			return static_cast<float64>(f);
+		}
+	}
+}
+
+
+// template parameters are byte indices corresponding to the individual bytes of iee754 in memory
+template <std::size_t hihi, std::size_t hilo, std::size_t lohi, std::size_t lolo>
+struct IEEE754binary32Emulated {
+public:
+	using self_t = IEEE754binary32Emulated<hihi, hilo, lohi, lolo>;
+	std::byte bytes[4];
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		return bytes[i];
+	}
+	IEEE754binary32Emulated() = default;
+	MPT_FORCEINLINE explicit IEEE754binary32Emulated(float32 f) {
+		SetInt32(EncodeIEEE754binary32(f));
+	}
+	// b0...b3 are in memory order, i.e. depend on the endianness of this type
+	// little endian: (0x00,0x00,0x80,0x3f)
+	// big endian:    (0x3f,0x80,0x00,0x00)
+	MPT_FORCEINLINE explicit IEEE754binary32Emulated(std::byte b0, std::byte b1, std::byte b2, std::byte b3) {
+		bytes[0] = b0;
+		bytes[1] = b1;
+		bytes[2] = b2;
+		bytes[3] = b3;
+	}
+	MPT_FORCEINLINE operator float32() const {
+		return DecodeIEEE754binary32(GetInt32());
+	}
+	MPT_FORCEINLINE self_t & SetInt32(uint32 i) {
+		bytes[hihi] = static_cast<std::byte>(i >> 24);
+		bytes[hilo] = static_cast<std::byte>(i >> 16);
+		bytes[lohi] = static_cast<std::byte>(i >> 8);
+		bytes[lolo] = static_cast<std::byte>(i >> 0);
+		return *this;
+	}
+	MPT_FORCEINLINE uint32 GetInt32() const {
+		return 0u
+			| (static_cast<uint32>(bytes[hihi]) << 24)
+			| (static_cast<uint32>(bytes[hilo]) << 16)
+			| (static_cast<uint32>(bytes[lohi]) << 8)
+			| (static_cast<uint32>(bytes[lolo]) << 0);
+	}
+	MPT_FORCEINLINE bool operator==(const self_t & cmp) const {
+		return true
+			&& bytes[0] == cmp.bytes[0]
+			&& bytes[1] == cmp.bytes[1]
+			&& bytes[2] == cmp.bytes[2]
+			&& bytes[3] == cmp.bytes[3];
+	}
+	MPT_FORCEINLINE bool operator!=(const self_t & cmp) const {
+		return !(*this == cmp);
+	}
+};
+template <std::size_t hihihi, std::size_t hihilo, std::size_t hilohi, std::size_t hilolo, std::size_t lohihi, std::size_t lohilo, std::size_t lolohi, std::size_t lololo>
+struct IEEE754binary64Emulated {
+public:
+	using self_t = IEEE754binary64Emulated<hihihi, hihilo, hilohi, hilolo, lohihi, lohilo, lolohi, lololo>;
+	std::byte bytes[8];
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		return bytes[i];
+	}
+	IEEE754binary64Emulated() = default;
+	MPT_FORCEINLINE explicit IEEE754binary64Emulated(float64 f) {
+		SetInt64(EncodeIEEE754binary64(f));
+	}
+	MPT_FORCEINLINE explicit IEEE754binary64Emulated(std::byte b0, std::byte b1, std::byte b2, std::byte b3, std::byte b4, std::byte b5, std::byte b6, std::byte b7) {
+		bytes[0] = b0;
+		bytes[1] = b1;
+		bytes[2] = b2;
+		bytes[3] = b3;
+		bytes[4] = b4;
+		bytes[5] = b5;
+		bytes[6] = b6;
+		bytes[7] = b7;
+	}
+	MPT_FORCEINLINE operator float64() const {
+		return DecodeIEEE754binary64(GetInt64());
+	}
+	MPT_FORCEINLINE self_t & SetInt64(uint64 i) {
+		bytes[hihihi] = static_cast<std::byte>(i >> 56);
+		bytes[hihilo] = static_cast<std::byte>(i >> 48);
+		bytes[hilohi] = static_cast<std::byte>(i >> 40);
+		bytes[hilolo] = static_cast<std::byte>(i >> 32);
+		bytes[lohihi] = static_cast<std::byte>(i >> 24);
+		bytes[lohilo] = static_cast<std::byte>(i >> 16);
+		bytes[lolohi] = static_cast<std::byte>(i >> 8);
+		bytes[lololo] = static_cast<std::byte>(i >> 0);
+		return *this;
+	}
+	MPT_FORCEINLINE uint64 GetInt64() const {
+		return 0u
+			| (static_cast<uint64>(bytes[hihihi]) << 56)
+			| (static_cast<uint64>(bytes[hihilo]) << 48)
+			| (static_cast<uint64>(bytes[hilohi]) << 40)
+			| (static_cast<uint64>(bytes[hilolo]) << 32)
+			| (static_cast<uint64>(bytes[lohihi]) << 24)
+			| (static_cast<uint64>(bytes[lohilo]) << 16)
+			| (static_cast<uint64>(bytes[lolohi]) << 8)
+			| (static_cast<uint64>(bytes[lololo]) << 0);
+	}
+	MPT_FORCEINLINE bool operator==(const self_t & cmp) const {
+		return true
+			&& bytes[0] == cmp.bytes[0]
+			&& bytes[1] == cmp.bytes[1]
+			&& bytes[2] == cmp.bytes[2]
+			&& bytes[3] == cmp.bytes[3]
+			&& bytes[4] == cmp.bytes[4]
+			&& bytes[5] == cmp.bytes[5]
+			&& bytes[6] == cmp.bytes[6]
+			&& bytes[7] == cmp.bytes[7];
+	}
+	MPT_FORCEINLINE bool operator!=(const self_t & cmp) const {
+		return !(*this == cmp);
+	}
+};
+
+using IEEE754binary32EmulatedBE = IEEE754binary32Emulated<0, 1, 2, 3>;
+using IEEE754binary32EmulatedLE = IEEE754binary32Emulated<3, 2, 1, 0>;
+using IEEE754binary64EmulatedBE = IEEE754binary64Emulated<0, 1, 2, 3, 4, 5, 6, 7>;
+using IEEE754binary64EmulatedLE = IEEE754binary64Emulated<7, 6, 5, 4, 3, 2, 1, 0>;
+
+constexpr bool declare_binary_safe(const IEEE754binary32EmulatedBE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary32EmulatedLE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64EmulatedBE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64EmulatedLE &) {
+	return true;
+}
+
+static_assert(mpt::check_binary_size<IEEE754binary32EmulatedBE>(4));
+static_assert(mpt::check_binary_size<IEEE754binary32EmulatedLE>(4));
+static_assert(mpt::check_binary_size<IEEE754binary64EmulatedBE>(8));
+static_assert(mpt::check_binary_size<IEEE754binary64EmulatedLE>(8));
+
+template <mpt::endian endian = mpt::endian::native>
+struct IEEE754binary32Native {
+public:
+	float32 value;
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			return static_cast<std::byte>(EncodeIEEE754binary32(value) >> (i * 8));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			return static_cast<std::byte>(EncodeIEEE754binary32(value) >> ((4 - 1 - i) * 8));
+		}
+	}
+	IEEE754binary32Native() = default;
+	MPT_FORCEINLINE explicit IEEE754binary32Native(float32 f) {
+		value = f;
+	}
+	// b0...b3 are in memory order, i.e. depend on the endianness of this type
+	// little endian: (0x00,0x00,0x80,0x3f)
+	// big endian:    (0x3f,0x80,0x00,0x00)
+	MPT_FORCEINLINE explicit IEEE754binary32Native(std::byte b0, std::byte b1, std::byte b2, std::byte b3) {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			value = DecodeIEEE754binary32(0u | (static_cast<uint32>(b0) << 0) | (static_cast<uint32>(b1) << 8) | (static_cast<uint32>(b2) << 16) | (static_cast<uint32>(b3) << 24));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			value = DecodeIEEE754binary32(0u | (static_cast<uint32>(b0) << 24) | (static_cast<uint32>(b1) << 16) | (static_cast<uint32>(b2) << 8) | (static_cast<uint32>(b3) << 0));
+		}
+	}
+	MPT_FORCEINLINE operator float32() const {
+		return value;
+	}
+	MPT_FORCEINLINE IEEE754binary32Native & SetInt32(uint32 i) {
+		value = DecodeIEEE754binary32(i);
+		return *this;
+	}
+	MPT_FORCEINLINE uint32 GetInt32() const {
+		return EncodeIEEE754binary32(value);
+	}
+	MPT_FORCEINLINE bool operator==(const IEEE754binary32Native & cmp) const {
+		return value == cmp.value;
+	}
+	MPT_FORCEINLINE bool operator!=(const IEEE754binary32Native & cmp) const {
+		return value != cmp.value;
+	}
+};
+
+template <mpt::endian endian = mpt::endian::native>
+struct IEEE754binary64Native {
+public:
+	float64 value;
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			return mpt::byte_cast<std::byte>(static_cast<uint8>(EncodeIEEE754binary64(value) >> (i * 8)));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			return mpt::byte_cast<std::byte>(static_cast<uint8>(EncodeIEEE754binary64(value) >> ((8 - 1 - i) * 8)));
+		}
+	}
+	IEEE754binary64Native() = default;
+	MPT_FORCEINLINE explicit IEEE754binary64Native(float64 f) {
+		value = f;
+	}
+	MPT_FORCEINLINE explicit IEEE754binary64Native(std::byte b0, std::byte b1, std::byte b2, std::byte b3, std::byte b4, std::byte b5, std::byte b6, std::byte b7) {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			value = DecodeIEEE754binary64(0ull | (static_cast<uint64>(b0) << 0) | (static_cast<uint64>(b1) << 8) | (static_cast<uint64>(b2) << 16) | (static_cast<uint64>(b3) << 24) | (static_cast<uint64>(b4) << 32) | (static_cast<uint64>(b5) << 40) | (static_cast<uint64>(b6) << 48) | (static_cast<uint64>(b7) << 56));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			value = DecodeIEEE754binary64(0ull | (static_cast<uint64>(b0) << 56) | (static_cast<uint64>(b1) << 48) | (static_cast<uint64>(b2) << 40) | (static_cast<uint64>(b3) << 32) | (static_cast<uint64>(b4) << 24) | (static_cast<uint64>(b5) << 16) | (static_cast<uint64>(b6) << 8) | (static_cast<uint64>(b7) << 0));
+		}
+	}
+	MPT_FORCEINLINE operator float64() const {
+		return value;
+	}
+	MPT_FORCEINLINE IEEE754binary64Native & SetInt64(uint64 i) {
+		value = DecodeIEEE754binary64(i);
+		return *this;
+	}
+	MPT_FORCEINLINE uint64 GetInt64() const {
+		return EncodeIEEE754binary64(value);
+	}
+	MPT_FORCEINLINE bool operator==(const IEEE754binary64Native & cmp) const {
+		return value == cmp.value;
+	}
+	MPT_FORCEINLINE bool operator!=(const IEEE754binary64Native & cmp) const {
+		return value != cmp.value;
+	}
+};
+
+static_assert((sizeof(IEEE754binary32Native<>) == 4));
+static_assert((sizeof(IEEE754binary64Native<>) == 8));
+
+constexpr bool declare_binary_safe(const IEEE754binary32Native<> &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64Native<> &) noexcept {
+	return true;
+}
+
+template <bool is_ieee754, mpt::endian endian = mpt::endian::native>
+struct IEEE754binary_types {
+	using IEEE754binary32LE = IEEE754binary32EmulatedLE;
+	using IEEE754binary32BE = IEEE754binary32EmulatedBE;
+	using IEEE754binary64LE = IEEE754binary64EmulatedLE;
+	using IEEE754binary64BE = IEEE754binary64EmulatedBE;
+};
+template <>
+struct IEEE754binary_types<true, mpt::endian::little> {
+	using IEEE754binary32LE = IEEE754binary32Native<>;
+	using IEEE754binary32BE = IEEE754binary32EmulatedBE;
+	using IEEE754binary64LE = IEEE754binary64Native<>;
+	using IEEE754binary64BE = IEEE754binary64EmulatedBE;
+};
+template <>
+struct IEEE754binary_types<true, mpt::endian::big> {
+	using IEEE754binary32LE = IEEE754binary32EmulatedLE;
+	using IEEE754binary32BE = IEEE754binary32Native<>;
+	using IEEE754binary64LE = IEEE754binary64EmulatedLE;
+	using IEEE754binary64BE = IEEE754binary64Native<>;
+};
+
+using IEEE754binary32LE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32LE;
+using IEEE754binary32BE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32BE;
+using IEEE754binary64LE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64LE;
+using IEEE754binary64BE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64BE;
+
+static_assert(sizeof(IEEE754binary32LE) == 4);
+static_assert(sizeof(IEEE754binary32BE) == 4);
+static_assert(sizeof(IEEE754binary64LE) == 8);
+static_assert(sizeof(IEEE754binary64BE) == 8);
+
+
+// unaligned
+
+using float32le = IEEE754binary32EmulatedLE;
+using float32be = IEEE754binary32EmulatedBE;
+using float64le = IEEE754binary64EmulatedLE;
+using float64be = IEEE754binary64EmulatedBE;
+
+static_assert(sizeof(float32le) == 4);
+static_assert(sizeof(float32be) == 4);
+static_assert(sizeof(float64le) == 8);
+static_assert(sizeof(float64be) == 8);
+
+
+// potentially aligned
+
+using float32le_fast = IEEE754binary32LE;
+using float32be_fast = IEEE754binary32BE;
+using float64le_fast = IEEE754binary64LE;
+using float64be_fast = IEEE754binary64BE;
+
+static_assert(sizeof(float32le_fast) == 4);
+static_assert(sizeof(float32be_fast) == 4);
+static_assert(sizeof(float64le_fast) == 8);
+static_assert(sizeof(float64be_fast) == 8);
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_FLOATINGPOINT_HPP

Property changes on: src/mpt/endian/floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/integer.hpp
===================================================================
--- src/mpt/endian/integer.hpp	(nonexistent)
+++ src/mpt/endian/integer.hpp	(working copy)
@@ -0,0 +1,487 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_INTEGER_HPP
+#define MPT_ENDIAN_INTEGER_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/bit.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#include <limits>
+#include <type_traits>
+
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+
+#if MPT_COMPILER_MSVC
+#include <intrin.h>
+#endif
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+struct BigEndian_tag {
+	static constexpr mpt::endian endian = mpt::endian::big;
+};
+
+struct LittleEndian_tag {
+	static constexpr mpt::endian endian = mpt::endian::little;
+};
+
+
+
+constexpr inline uint16 constexpr_bswap16(uint16 x) noexcept {
+	return uint16(0)
+		| ((x >> 8) & 0x00FFu)
+		| ((x << 8) & 0xFF00u);
+}
+
+constexpr inline uint32 constexpr_bswap32(uint32 x) noexcept {
+	return uint32(0)
+		| ((x & 0x000000FFu) << 24)
+		| ((x & 0x0000FF00u) << 8)
+		| ((x & 0x00FF0000u) >> 8)
+		| ((x & 0xFF000000u) >> 24);
+}
+
+constexpr inline uint64 constexpr_bswap64(uint64 x) noexcept {
+	return uint64(0)
+		| (((x >> 0) & 0xffull) << 56)
+		| (((x >> 8) & 0xffull) << 48)
+		| (((x >> 16) & 0xffull) << 40)
+		| (((x >> 24) & 0xffull) << 32)
+		| (((x >> 32) & 0xffull) << 24)
+		| (((x >> 40) & 0xffull) << 16)
+		| (((x >> 48) & 0xffull) << 8)
+		| (((x >> 56) & 0xffull) << 0);
+}
+
+#if MPT_COMPILER_GCC
+#define MPT_bswap16 __builtin_bswap16
+#define MPT_bswap32 __builtin_bswap32
+#define MPT_bswap64 __builtin_bswap64
+#elif MPT_COMPILER_MSVC
+#define MPT_bswap16 _byteswap_ushort
+#define MPT_bswap32 _byteswap_ulong
+#define MPT_bswap64 _byteswap_uint64
+#endif
+
+// No intrinsics available
+#ifndef MPT_bswap16
+#define MPT_bswap16(x) mpt::constexpr_bswap16(x)
+#endif
+#ifndef MPT_bswap32
+#define MPT_bswap32(x) mpt::constexpr_bswap32(x)
+#endif
+#ifndef MPT_bswap64
+#define MPT_bswap64(x) mpt::constexpr_bswap64(x)
+#endif
+
+
+
+template <typename T, typename Tendian, std::size_t size>
+MPT_CONSTEXPRINLINE std::array<std::byte, size> EndianEncode(T val) noexcept {
+	static_assert(Tendian::endian == mpt::endian::little || Tendian::endian == mpt::endian::big);
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(!std::numeric_limits<T>::is_signed);
+	static_assert(sizeof(T) == size);
+	using base_type = T;
+	using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+	using endian_type = Tendian;
+	unsigned_base_type uval = static_cast<unsigned_base_type>(val);
+	std::array<std::byte, size> data{};
+	if constexpr (endian_type::endian == mpt::endian::little) {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			data[i] = static_cast<std::byte>(static_cast<uint8>((uval >> (i * 8)) & 0xffu));
+		}
+	} else {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			data[(sizeof(base_type) - 1) - i] = static_cast<std::byte>(static_cast<uint8>((uval >> (i * 8)) & 0xffu));
+		}
+	}
+	return data;
+}
+
+template <typename T, typename Tendian, std::size_t size>
+MPT_CONSTEXPRINLINE T EndianDecode(std::array<std::byte, size> data) noexcept {
+	static_assert(Tendian::endian == mpt::endian::little || Tendian::endian == mpt::endian::big);
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(!std::numeric_limits<T>::is_signed);
+	static_assert(sizeof(T) == size);
+	using base_type = T;
+	using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+	using endian_type = Tendian;
+	base_type val = base_type();
+	unsigned_base_type uval = unsigned_base_type();
+	if constexpr (endian_type::endian == mpt::endian::little) {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			uval |= static_cast<unsigned_base_type>(static_cast<uint8>(data[i])) << (i * 8);
+		}
+	} else {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			uval |= static_cast<unsigned_base_type>(static_cast<uint8>(data[(sizeof(base_type) - 1) - i])) << (i * 8);
+		}
+	}
+	val = static_cast<base_type>(uval);
+	return val;
+}
+
+
+MPT_CONSTEXPR20_FUN uint64 SwapBytesImpl(uint64 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap64(value);
+	}
+	else {
+		return MPT_bswap64(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN uint32 SwapBytesImpl(uint32 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap32(value);
+	}
+	else {
+		return MPT_bswap32(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN uint16 SwapBytesImpl(uint16 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap16(value);
+	}
+	else {
+		return MPT_bswap16(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int64 SwapBytesImpl(int64 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap64(value);
+	}
+	else {
+		return MPT_bswap64(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int32 SwapBytesImpl(int32 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap32(value);
+	}
+	else {
+		return MPT_bswap32(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int16 SwapBytesImpl(int16 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap16(value);
+	}
+	else {
+		return MPT_bswap16(value);
+	}
+}
+
+// Do NOT remove these overloads, even if they seem useless.
+// We do not want risking to extend 8bit integers to int and then
+// endian-converting and casting back to int.
+// Thus these overloads.
+
+MPT_CONSTEXPR20_FUN uint8 SwapBytesImpl(uint8 value) noexcept {
+	return value;
+}
+
+MPT_CONSTEXPR20_FUN int8 SwapBytesImpl(int8 value) noexcept {
+	return value;
+}
+
+MPT_CONSTEXPR20_FUN char SwapBytesImpl(char value) noexcept {
+	return value;
+}
+
+#undef MPT_bswap16
+#undef MPT_bswap32
+#undef MPT_bswap64
+
+
+
+// On-disk integer types with defined endianness and no alignemnt requirements
+// Note: To easily debug module loaders (and anything else that uses this
+// wrapper struct), you can use the Debugger Visualizers available in
+// build/vs/debug/ to conveniently view the wrapped contents.
+
+template <typename T, typename Tendian>
+struct packed {
+public:
+	using base_type = T;
+	using endian_type = Tendian;
+
+public:
+	std::array<std::byte, sizeof(base_type)> data;
+
+public:
+	MPT_CONSTEXPR20_FUN void set(base_type val) noexcept {
+		static_assert(std::numeric_limits<T>::is_integer);
+		MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+			if constexpr (endian_type::endian == mpt::endian::big) {
+				typename std::make_unsigned<base_type>::type uval = val;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					data[i] = static_cast<std::byte>((uval >> (8 * (sizeof(base_type) - 1 - i))) & 0xffu);
+				}
+			} else {
+				typename std::make_unsigned<base_type>::type uval = val;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					data[i] = static_cast<std::byte>((uval >> (8 * i)) & 0xffu);
+				}
+			}
+		}
+		else {
+			if constexpr (mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big) {
+				if constexpr (mpt::endian::native != endian_type::endian) {
+					val = mpt::SwapBytesImpl(val);
+				}
+				std::memcpy(data.data(), &val, sizeof(val));
+			} else {
+				using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+				data = EndianEncode<unsigned_base_type, Tendian, sizeof(T)>(val);
+			}
+		}
+	}
+	MPT_CONSTEXPR20_FUN base_type get() const noexcept {
+		static_assert(std::numeric_limits<T>::is_integer);
+		MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+			if constexpr (endian_type::endian == mpt::endian::big) {
+				typename std::make_unsigned<base_type>::type uval = 0;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					uval |= static_cast<typename std::make_unsigned<base_type>::type>(data[i]) << (8 * (sizeof(base_type) - 1 - i));
+				}
+				return static_cast<base_type>(uval);
+			} else {
+				typename std::make_unsigned<base_type>::type uval = 0;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					uval |= static_cast<typename std::make_unsigned<base_type>::type>(data[i]) << (8 * i);
+				}
+				return static_cast<base_type>(uval);
+			}
+		}
+		else {
+			if constexpr (mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big) {
+				base_type val = base_type();
+				std::memcpy(&val, data.data(), sizeof(val));
+				if constexpr (mpt::endian::native != endian_type::endian) {
+					val = mpt::SwapBytesImpl(val);
+				}
+				return val;
+			} else {
+				using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+				return EndianDecode<unsigned_base_type, Tendian, sizeof(T)>(data);
+			}
+		}
+	}
+	MPT_CONSTEXPR20_FUN packed & operator=(const base_type & val) noexcept {
+		set(val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN operator base_type() const noexcept {
+		return get();
+	}
+
+public:
+	MPT_CONSTEXPR20_FUN packed & operator&=(base_type val) noexcept {
+		set(get() & val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator|=(base_type val) noexcept {
+		set(get() | val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator^=(base_type val) noexcept {
+		set(get() ^ val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator+=(base_type val) noexcept {
+		set(get() + val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator-=(base_type val) noexcept {
+		set(get() - val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator*=(base_type val) noexcept {
+		set(get() * val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator/=(base_type val) noexcept {
+		set(get() / val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator%=(base_type val) noexcept {
+		set(get() % val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator++() noexcept { // prefix
+		set(get() + 1);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator--() noexcept { // prefix
+		set(get() - 1);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN base_type operator++(int) noexcept { // postfix
+		base_type old = get();
+		set(old + 1);
+		return old;
+	}
+	MPT_CONSTEXPR20_FUN base_type operator--(int) noexcept { // postfix
+		base_type old = get();
+		set(old - 1);
+		return old;
+	}
+};
+
+using int64le = packed<int64, LittleEndian_tag>;
+using int32le = packed<int32, LittleEndian_tag>;
+using int16le = packed<int16, LittleEndian_tag>;
+using int8le = packed<int8, LittleEndian_tag>;
+using uint64le = packed<uint64, LittleEndian_tag>;
+using uint32le = packed<uint32, LittleEndian_tag>;
+using uint16le = packed<uint16, LittleEndian_tag>;
+using uint8le = packed<uint8, LittleEndian_tag>;
+
+using int64be = packed<int64, BigEndian_tag>;
+using int32be = packed<int32, BigEndian_tag>;
+using int16be = packed<int16, BigEndian_tag>;
+using int8be = packed<int8, BigEndian_tag>;
+using uint64be = packed<uint64, BigEndian_tag>;
+using uint32be = packed<uint32, BigEndian_tag>;
+using uint16be = packed<uint16, BigEndian_tag>;
+using uint8be = packed<uint8, BigEndian_tag>;
+
+constexpr bool declare_binary_safe(const int64le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int32le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int16le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint64le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint32le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint16le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8le &) {
+	return true;
+}
+
+constexpr bool declare_binary_safe(const int64be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int32be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int16be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint64be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint32be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint16be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8be &) {
+	return true;
+}
+
+static_assert(mpt::check_binary_size<int64le>(8));
+static_assert(mpt::check_binary_size<int32le>(4));
+static_assert(mpt::check_binary_size<int16le>(2));
+static_assert(mpt::check_binary_size<int8le>(1));
+static_assert(mpt::check_binary_size<uint64le>(8));
+static_assert(mpt::check_binary_size<uint32le>(4));
+static_assert(mpt::check_binary_size<uint16le>(2));
+static_assert(mpt::check_binary_size<uint8le>(1));
+
+static_assert(mpt::check_binary_size<int64be>(8));
+static_assert(mpt::check_binary_size<int32be>(4));
+static_assert(mpt::check_binary_size<int16be>(2));
+static_assert(mpt::check_binary_size<int8be>(1));
+static_assert(mpt::check_binary_size<uint64be>(8));
+static_assert(mpt::check_binary_size<uint32be>(4));
+static_assert(mpt::check_binary_size<uint16be>(2));
+static_assert(mpt::check_binary_size<uint8be>(1));
+
+
+
+template <typename T>
+struct make_le {
+	using type = packed<typename std::remove_const<T>::type, LittleEndian_tag>;
+};
+
+template <typename T>
+struct make_be {
+	using type = packed<typename std::remove_const<T>::type, BigEndian_tag>;
+};
+
+template <typename T>
+MPT_CONSTEXPR20_FUN auto as_le(T v) noexcept -> typename mpt::make_le<typename std::remove_const<T>::type>::type {
+	typename mpt::make_le<typename std::remove_const<T>::type>::type res{};
+	res = v;
+	return res;
+}
+
+template <typename T>
+MPT_CONSTEXPR20_FUN auto as_be(T v) noexcept -> typename mpt::make_be<typename std::remove_const<T>::type>::type {
+	typename mpt::make_be<typename std::remove_const<T>::type>::type res{};
+	res = v;
+	return res;
+}
+
+template <typename Tpacked>
+MPT_CONSTEXPR20_FUN Tpacked as_endian(typename Tpacked::base_type v) noexcept {
+	Tpacked res{};
+	res = v;
+	return res;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+namespace std {
+template <typename T, typename Tendian>
+class numeric_limits<mpt::packed<T, Tendian>> : public std::numeric_limits<T> { };
+template <typename T, typename Tendian>
+class numeric_limits<const mpt::packed<T, Tendian>> : public std::numeric_limits<const T> { };
+} // namespace std
+
+
+
+#endif // MPT_ENDIAN_INTEGER_HPP

Property changes on: src/mpt/endian/integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/tests/tests_endian_floatingpoint.hpp
===================================================================
--- src/mpt/endian/tests/tests_endian_floatingpoint.hpp	(nonexistent)
+++ src/mpt/endian/tests/tests_endian_floatingpoint.hpp	(working copy)
@@ -0,0 +1,66 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP
+#define MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/floatingpoint.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_endian_floatingpoint{
+	"mpt/endian/floatingpoint",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary32(1.0f), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary32(-1.0f), 0xbf800000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x00000000u), 0.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x41840000u), 16.5f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3faa0000u), 1.328125f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0xbfaa0000u), -1.328125f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3f800000u), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x00000000u), 0.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0xbf800000u), -1.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3f800000u), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(1.0f).GetInt32(), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(1.0f).GetInt32(), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x80), mpt::as_byte(0x3f)), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(mpt::as_byte(0x3f), mpt::as_byte(0x80), mpt::as_byte(0x00), mpt::as_byte(0x00)), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(1.0f), IEEE754binary32LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x80), mpt::as_byte(0x3f)));
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(1.0f), IEEE754binary32BE(mpt::as_byte(0x3f), mpt::as_byte(0x80), mpt::as_byte(0x00), mpt::as_byte(0x00)));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary64(1.0), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary64(-1.0), 0xbff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x4030800000000000ull), 16.5);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3FF5400000000000ull), 1.328125);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0xBFF5400000000000ull), -1.328125);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3ff0000000000000ull), 1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0xbff0000000000000ull), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3ff0000000000000ull), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(1.0).GetInt64(), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(1.0).GetInt64(), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0xf0), mpt::as_byte(0x3f)), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(mpt::as_byte(0x3f), mpt::as_byte(0xf0), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00)), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(1.0), IEEE754binary64LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0xf0), mpt::as_byte(0x3f)));
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(1.0), IEEE754binary64BE(mpt::as_byte(0x3f), mpt::as_byte(0xf0), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00)));
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP

Property changes on: src/mpt/endian/tests/tests_endian_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/tests/tests_endian_integer.hpp
===================================================================
--- src/mpt/endian/tests/tests_endian_integer.hpp	(nonexistent)
+++ src/mpt/endian/tests/tests_endian_integer.hpp	(working copy)
@@ -0,0 +1,118 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP
+#define MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_endian_integer{
+	"mpt/endian/integer",
+	[](mpt::test::context & context) {
+		static_assert(std::numeric_limits<int8le>::min() == std::numeric_limits<int8>::min());
+		static_assert(std::numeric_limits<uint8le>::min() == std::numeric_limits<uint8>::min());
+
+		static_assert(std::numeric_limits<int16le>::min() == std::numeric_limits<int16>::min());
+		static_assert(std::numeric_limits<uint16le>::min() == std::numeric_limits<uint16>::min());
+
+		static_assert(std::numeric_limits<int32le>::min() == std::numeric_limits<int32>::min());
+		static_assert(std::numeric_limits<uint32le>::min() == std::numeric_limits<uint32>::min());
+
+		static_assert(std::numeric_limits<int64le>::min() == std::numeric_limits<int64>::min());
+		static_assert(std::numeric_limits<uint64le>::min() == std::numeric_limits<uint64>::min());
+
+		static_assert(std::numeric_limits<int8le>::max() == std::numeric_limits<int8>::max());
+		static_assert(std::numeric_limits<uint8le>::max() == std::numeric_limits<uint8>::max());
+
+		static_assert(std::numeric_limits<int16le>::max() == std::numeric_limits<int16>::max());
+		static_assert(std::numeric_limits<uint16le>::max() == std::numeric_limits<uint16>::max());
+
+		static_assert(std::numeric_limits<int32le>::max() == std::numeric_limits<int32>::max());
+		static_assert(std::numeric_limits<uint32le>::max() == std::numeric_limits<uint32>::max());
+
+		static_assert(std::numeric_limits<int64le>::max() == std::numeric_limits<int64>::max());
+		static_assert(std::numeric_limits<uint64le>::max() == std::numeric_limits<uint64>::max());
+
+		struct test_endian_constexpr {
+			static MPT_CONSTEXPR20_FUN int32le test(uint32 x) {
+				int32le foo{};
+				foo = x;
+				return foo;
+			}
+		};
+
+		MPT_CONSTEXPR20_VAR int32le foo = test_endian_constexpr::test(23);
+		static_cast<void>(foo);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint8(0x12)), 0x12);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint16(0x1234)), 0x3412);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint32(0x12345678u)), 0x78563412u);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint64(0x123456789abcdef0ull)), 0xf0debc9a78563412ull);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int8(std::numeric_limits<int8>::min())), std::numeric_limits<int8>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int16(std::numeric_limits<int16>::min())), int16(0x80));
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int32(std::numeric_limits<int32>::min())), int32(0x80));
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int64(std::numeric_limits<int64>::min())), int64(0x80));
+
+		// Packed integers with defined endianness
+		{
+			int8le le8;
+			le8.set(-128);
+			int8be be8;
+			be8.set(-128);
+			MPT_TEST_EXPECT_EQUAL(le8, -128);
+			MPT_TEST_EXPECT_EQUAL(be8, -128);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le8, "\x80", 1), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be8, "\x80", 1), 0);
+			int16le le16;
+			le16.set(0x1234);
+			int16be be16;
+			be16.set(0x1234);
+			MPT_TEST_EXPECT_EQUAL(le16, 0x1234);
+			MPT_TEST_EXPECT_EQUAL(be16, 0x1234);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le16, "\x34\x12", 2), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be16, "\x12\x34", 2), 0);
+			uint32le le32;
+			le32.set(0xFFEEDDCCu);
+			uint32be be32;
+			be32.set(0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(le32, 0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(be32, 0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le32, "\xCC\xDD\xEE\xFF", 4), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be32, "\xFF\xEE\xDD\xCC", 4), 0);
+			uint64le le64;
+			le64.set(0xDEADC0DE15C0FFEEull);
+			uint64be be64;
+			be64.set(0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(le64, 0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(be64, 0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le64, "\xEE\xFF\xC0\x15\xDE\xC0\xAD\xDE", 8), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be64, "\xDE\xAD\xC0\xDE\x15\xC0\xFF\xEE", 8), 0);
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP

Property changes on: src/mpt/endian/tests/tests_endian_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/environment/environment.hpp
===================================================================
--- src/mpt/environment/environment.hpp	(nonexistent)
+++ src/mpt/environment/environment.hpp	(working copy)
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENVIRONMENT_ENVIRONMENT_HPP
+#define MPT_ENVIRONMENT_ENVIRONMENT_HPP
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/system_error/system_error.hpp"
+
+#include <optional>
+#if MPT_OS_WINDOWS
+#if defined(UNICODE) && !MPT_OS_WINDOWS_WINRT
+#include <vector>
+#endif // !MPT_OS_WINDOWS_WINRT
+#endif // MPT_OS_WINDOWS
+
+#include <cstdlib>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline std::optional<mpt::ustring> getenv(const mpt::ustring & env_var) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+	MPT_UNUSED(env_var);
+	return std::nullopt;
+#elif MPT_OS_WINDOWS && defined(UNICODE)
+	std::vector<WCHAR> buf(32767);
+	DWORD size = GetEnvironmentVariable(mpt::convert<std::wstring>(env_var).c_str(), buf.data(), 32767);
+	if (size == 0) {
+		mpt::windows::ExpectError(ERROR_ENVVAR_NOT_FOUND);
+		return std::nullopt;
+	}
+	return mpt::convert<mpt::ustring>(buf.data());
+#else
+	const char * val = std::getenv(mpt::convert<std::string>(mpt::environment_encoding, env_var).c_str());
+	if (!val) {
+		return std::nullopt;
+	}
+	return mpt::convert<mpt::ustring>(mpt::environment_encoding, val);
+#endif
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENVIRONMENT_ENVIRONMENT_HPP

Property changes on: src/mpt/environment/environment.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/exception_text/exception_text.hpp
===================================================================
--- src/mpt/exception_text/exception_text.hpp	(nonexistent)
+++ src/mpt/exception_text/exception_text.hpp	(working copy)
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP
+#define MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <exception>
+
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename Tstring>
+inline Tstring get_exception_text(const std::exception & e) {
+	if (e.what() && (std::strlen(e.what()) > 0)) {
+		return mpt::convert<Tstring>(mpt::exception_string{e.what()});
+	} else if (typeid(e).name() && (std::strlen(typeid(e).name()) > 0)) {
+		return mpt::convert<Tstring>(mpt::source_string{typeid(e).name()});
+	} else {
+		return mpt::convert<Tstring>(mpt::source_string{"unknown exception name"});
+	}
+}
+
+template <>
+inline std::string get_exception_text<std::string>(const std::exception & e) {
+	if (e.what() && (std::strlen(e.what()) > 0)) {
+		return std::string{e.what()};
+	} else if (typeid(e).name() && (std::strlen(typeid(e).name()) > 0)) {
+		return std::string{typeid(e).name()};
+	} else {
+		return std::string{"unknown exception name"};
+	}
+}
+
+
+template <typename Tstring>
+inline Tstring get_current_exception_text() {
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		return mpt::get_exception_text<Tstring>(e);
+	} catch (...) {
+		return mpt::convert<Tstring>(mpt::source_string{"unknown exception"});
+	}
+}
+
+template <>
+inline std::string get_current_exception_text<std::string>() {
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		return mpt::get_exception_text<std::string>(e);
+	} catch (...) {
+		return std::string{"unknown exception"};
+	}
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP

Property changes on: src/mpt/exception_text/exception_text.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/json/json.hpp
===================================================================
--- src/mpt/json/json.hpp	(nonexistent)
+++ src/mpt/json/json.hpp	(working copy)
@@ -0,0 +1,80 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_JSON_JSON_HPP
+#define MPT_JSON_JSON_HPP
+
+#include "mpt/base/detect.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#include <optional>
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmismatched-tags"
+#endif // MPT_COMPILER_CLANG
+#include "nlohmann/json.hpp"
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic pop
+#endif // MPT_COMPILER_CLANG
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+
+
+namespace nlohmann {
+template <>
+struct adl_serializer<mpt::ustring> {
+	static void to_json(json & j, const mpt::ustring & val) {
+		j = mpt::convert<std::string>(mpt::common_encoding::utf8, val);
+	}
+	static void from_json(const json & j, mpt::ustring & val) {
+		val = mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, j.get<std::string>());
+	}
+};
+template <typename Tvalue>
+struct adl_serializer<std::map<mpt::ustring, Tvalue>> {
+	static void to_json(json & j, const std::map<mpt::ustring, Tvalue> & val) {
+		std::map<std::string, Tvalue> utf8map;
+		for (const auto & value : val)
+		{
+			utf8map[mpt::convert<std::string>(mpt::common_encoding::utf8, value.first)] = value.second;
+		}
+		j = std::move(utf8map);
+	}
+	static void from_json(const json & j, std::map<mpt::ustring, Tvalue> & val) {
+		std::map<std::string, Tvalue> utf8map = j.get<std::map<std::string, Tvalue>>();
+		std::map<mpt::ustring, Tvalue> result;
+		for (const auto & value : utf8map)
+		{
+			result[mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, value.first)] = value.second;
+		}
+		val = std::move(result);
+	}
+};
+template <typename Tvalue>
+struct adl_serializer<std::optional<Tvalue>> {
+	static void to_json(json & j, const std::optional<Tvalue> & val) {
+		j = (val ? json{*val} : json{nullptr});
+	}
+	static void from_json(const json & j, std::optional<Tvalue> & val) {
+		if (!j.is_null())
+		{
+			val = j.get<Tvalue>();
+		} else
+		{
+			val = std::nullopt;
+		}
+	}
+};
+} // namespace nlohmann
+
+
+
+#endif // MPT_JSON_JSON_HPP

Property changes on: src/mpt/json/json.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/mutex/mutex.hpp
===================================================================
--- src/mpt/mutex/mutex.hpp	(nonexistent)
+++ src/mpt/mutex/mutex.hpp	(working copy)
@@ -0,0 +1,178 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_MUTEX_MUTEX_HPP
+#define MPT_MUTEX_MUTEX_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+
+#if !MPT_PLATFORM_MULTITHREADED
+#define MPT_MUTEX_NONE 1
+#elif MPT_COMPILER_GENERIC
+#define MPT_MUTEX_STD 1
+#elif MPT_OS_WINDOWS && MPT_LIBCXX_GNU && !defined(_GLIBCXX_HAS_GTHREADS) && defined(MPT_WITH_MINGWSTDTHREADS)
+#define MPT_MUTEX_STD 1
+#elif MPT_OS_WINDOWS && MPT_LIBCXX_GNU && !defined(_GLIBCXX_HAS_GTHREADS)
+#define MPT_MUTEX_WIN32 1
+#else
+#define MPT_MUTEX_STD 1
+#endif
+
+#ifndef MPT_MUTEX_STD
+#define MPT_MUTEX_STD 0
+#endif
+#ifndef MPT_MUTEX_WIN32
+#define MPT_MUTEX_WIN32 0
+#endif
+#ifndef MPT_MUTEX_NONE
+#define MPT_MUTEX_NONE 0
+#endif
+
+#if MPT_MUTEX_STD
+#if !MPT_COMPILER_GENERIC && (defined(__MINGW32__) || defined(__MINGW64__)) && !defined(_GLIBCXX_HAS_GTHREADS) && defined(MPT_WITH_MINGWSTDTHREADS)
+#include <mingw.mutex.h>
+#else
+#include <mutex>
+#endif
+#elif MPT_MUTEX_WIN32
+#include <windows.h>
+#endif // MPT_MUTEX
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_MUTEX_STD
+
+using mutex = std::mutex;
+using recursive_mutex = std::recursive_mutex;
+
+#elif MPT_MUTEX_WIN32
+
+// compatible with c++11 std::mutex, can eventually be replaced without touching any usage site
+class mutex {
+private:
+	CRITICAL_SECTION impl;
+
+public:
+	mutex() {
+		InitializeCriticalSection(&impl);
+	}
+	~mutex() {
+		DeleteCriticalSection(&impl);
+	}
+	void lock() {
+		EnterCriticalSection(&impl);
+	}
+	bool try_lock() {
+		return TryEnterCriticalSection(&impl) ? true : false;
+	}
+	void unlock() {
+		LeaveCriticalSection(&impl);
+	}
+};
+
+// compatible with c++11 std::recursive_mutex, can eventually be replaced without touching any usage site
+class recursive_mutex {
+private:
+	CRITICAL_SECTION impl;
+
+public:
+	recursive_mutex() {
+		InitializeCriticalSection(&impl);
+	}
+	~recursive_mutex() {
+		DeleteCriticalSection(&impl);
+	}
+	void lock() {
+		EnterCriticalSection(&impl);
+	}
+	bool try_lock() {
+		return TryEnterCriticalSection(&impl) ? true : false;
+	}
+	void unlock() {
+		LeaveCriticalSection(&impl);
+	}
+};
+
+#else // MPT_MUTEX_NONE
+
+class mutex {
+public:
+	mutex() {
+		return;
+	}
+	~mutex() {
+		return;
+	}
+	void lock() {
+		return;
+	}
+	bool try_lock() {
+		return true;
+	}
+	void unlock() {
+		return;
+	}
+};
+
+class recursive_mutex {
+public:
+	recursive_mutex() {
+		return;
+	}
+	~recursive_mutex() {
+		return;
+	}
+	void lock() {
+		return;
+	}
+	bool try_lock() {
+		return true;
+	}
+	void unlock() {
+		return;
+	}
+};
+
+#endif // MPT_MUTEX
+
+#if MPT_MUTEX_STD
+
+template <typename T>
+using lock_guard = std::lock_guard<T>;
+
+#else // !MPT_MUTEX_STD
+
+// compatible with c++11 std::lock_guard, can eventually be replaced without touching any usage site
+template <typename mutex_type>
+class lock_guard {
+private:
+	mutex_type & mutex;
+
+public:
+	lock_guard(mutex_type & m)
+		: mutex(m) {
+		mutex.lock();
+	}
+	~lock_guard() {
+		mutex.unlock();
+	}
+};
+
+#endif // MPT_MUTEX_STD
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_MUTEX_MUTEX_HPP

Property changes on: src/mpt/mutex/mutex.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/osinfo/windows_version.hpp
===================================================================
--- src/mpt/osinfo/windows_version.hpp	(nonexistent)
+++ src/mpt/osinfo/windows_version.hpp	(working copy)
@@ -0,0 +1,347 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_OSINFO_WINDOWS_VERSION_HPP
+#define MPT_OSINFO_WINDOWS_VERSION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace osinfo {
+
+namespace windows {
+
+
+
+class Version {
+
+public:
+	enum Number : uint64
+	{
+		WinNT4 = 0x0000000400000000ull,
+		Win2000 = 0x0000000500000000ull,
+		WinXP = 0x0000000500000001ull,
+		WinXP64 = 0x0000000500000002ull,
+		WinVista = 0x0000000600000000ull,
+		Win7 = 0x0000000600000001ull,
+		Win8 = 0x0000000600000002ull,
+		Win81 = 0x0000000600000003ull,
+		Win10 = 0x0000000a00000000ull,
+		WinNewer = Win10 + 1ull
+	};
+
+	struct System {
+		uint32 Major = 0;
+		uint32 Minor = 0;
+		System() = default;
+		constexpr System(Number number) noexcept
+			: Major(static_cast<uint32>((static_cast<uint64>(number) >> 32) & 0xffffffffu))
+			, Minor(static_cast<uint32>((static_cast<uint64>(number) >> 0) & 0xffffffffu)) {
+		}
+		explicit constexpr System(uint64 number) noexcept
+			: Major(static_cast<uint32>((number >> 32) & 0xffffffffu))
+			, Minor(static_cast<uint32>((number >> 0) & 0xffffffffu)) {
+		}
+		explicit constexpr System(uint32 major, uint32 minor) noexcept
+			: Major(major)
+			, Minor(minor) {
+		}
+		constexpr operator uint64() const noexcept {
+			return (static_cast<uint64>(Major) << 32) | (static_cast<uint64>(Minor) << 0);
+		}
+	};
+
+	struct ServicePack {
+		uint16 Major = 0;
+		uint16 Minor = 0;
+		ServicePack() = default;
+		explicit constexpr ServicePack(uint16 major, uint16 minor) noexcept
+			: Major(major)
+			, Minor(minor) {
+		}
+		constexpr bool HasServicePack() const noexcept {
+			return Major != 0 || Minor != 0;
+		}
+		constexpr operator uint32() const noexcept {
+			return (static_cast<uint32>(Major) << 16) | (static_cast<uint32>(Minor) << 0);
+		}
+	};
+
+	typedef uint32 Build;
+
+	typedef uint32 TypeId;
+
+protected:
+	bool m_SystemIsWindows;
+
+	System m_System;
+	ServicePack m_ServicePack;
+	Build m_Build;
+	TypeId m_Type;
+
+protected:
+	Version() noexcept
+		: m_SystemIsWindows(false)
+		, m_System()
+		, m_ServicePack()
+		, m_Build()
+		, m_Type() {
+	}
+
+public:
+	static Version NoWindows() noexcept {
+		return Version();
+	}
+
+	Version(mpt::osinfo::windows::Version::System system, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build, mpt::osinfo::windows::Version::TypeId type) noexcept
+		: m_SystemIsWindows(true)
+		, m_System(system)
+		, m_ServicePack(servicePack)
+		, m_Build(build)
+		, m_Type(type) {
+	}
+
+protected:
+#if MPT_OS_WINDOWS
+
+	static mpt::osinfo::windows::Version VersionFromNTDDI_VERSION() noexcept {
+		// Initialize to used SDK version
+		mpt::osinfo::windows::Version::System System =
+#if NTDDI_VERSION >= 0x0A000000 // NTDDI_WIN10
+			mpt::osinfo::windows::Version::Win10
+#elif NTDDI_VERSION >= 0x06030000 // NTDDI_WINBLUE
+			mpt::osinfo::windows::Version::Win81
+#elif NTDDI_VERSION >= 0x06020000 // NTDDI_WIN8
+			mpt::osinfo::windows::Version::Win8
+#elif NTDDI_VERSION >= 0x06010000 // NTDDI_WIN7
+			mpt::osinfo::windows::Version::Win7
+#elif NTDDI_VERSION >= 0x06000000 // NTDDI_VISTA
+			mpt::osinfo::windows::Version::WinVista
+#elif NTDDI_VERSION >= 0x05020000 // NTDDI_WS03
+			mpt::osinfo::windows::Version::WinXP64
+#elif NTDDI_VERSION >= NTDDI_WINXP
+			mpt::osinfo::windows::Version::WinXP
+#elif NTDDI_VERSION >= NTDDI_WIN2K
+			mpt::osinfo::windows::Version::Win2000
+#else
+			mpt::osinfo::windows::Version::WinNT4
+#endif
+			;
+		return mpt::osinfo::windows::Version(System, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
+	}
+
+	static mpt::osinfo::windows::Version::System SystemVersionFrom_WIN32_WINNT() noexcept {
+#if defined(_WIN32_WINNT)
+		return mpt::osinfo::windows::Version::System((static_cast<uint64>(_WIN32_WINNT) & 0xff00u) >> 8, (static_cast<uint64>(_WIN32_WINNT) & 0x00ffu) >> 0);
+#else
+		return mpt::osinfo::windows::Version::System();
+#endif
+	}
+
+	static mpt::osinfo::windows::Version GatherWindowsVersion() noexcept {
+#if MPT_OS_WINDOWS_WINRT
+		return VersionFromNTDDI_VERSION();
+#else // !MPT_OS_WINDOWS_WINRT
+		OSVERSIONINFOEXW versioninfoex{};
+		versioninfoex.dwOSVersionInfoSize = sizeof(versioninfoex);
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4996)  // 'GetVersionExW': was declared deprecated
+#pragma warning(disable : 28159) // Consider using 'IsWindows*' instead of 'GetVersionExW'. Reason: Deprecated. Use VerifyVersionInfo* or IsWindows* macros from VersionHelpers.
+#endif                           // MPT_COMPILER_MSVC
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif // MPT_COMPILER_CLANG
+		if (GetVersionExW((LPOSVERSIONINFOW)&versioninfoex) == FALSE) {
+			return VersionFromNTDDI_VERSION();
+		}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic pop
+#endif                       // MPT_COMPILER_CLANG
+		if (versioninfoex.dwPlatformId != VER_PLATFORM_WIN32_NT) {
+			return VersionFromNTDDI_VERSION();
+		}
+		DWORD dwProductType = 0;
+#if (_WIN32_WINNT >= 0x0600) // _WIN32_WINNT_VISTA
+		dwProductType = PRODUCT_UNDEFINED;
+		if (GetProductInfo(versioninfoex.dwMajorVersion, versioninfoex.dwMinorVersion, versioninfoex.wServicePackMajor, versioninfoex.wServicePackMinor, &dwProductType) == FALSE) {
+			dwProductType = PRODUCT_UNDEFINED;
+		}
+#endif
+		return mpt::osinfo::windows::Version(
+			mpt::osinfo::windows::Version::System(versioninfoex.dwMajorVersion, versioninfoex.dwMinorVersion),
+			mpt::osinfo::windows::Version::ServicePack(versioninfoex.wServicePackMajor, versioninfoex.wServicePackMinor),
+			versioninfoex.dwBuildNumber,
+			dwProductType);
+#endif // MPT_OS_WINDOWS_WINRT
+	}
+
+#endif // MPT_OS_WINDOWS
+
+public:
+	static mpt::osinfo::windows::Version Current() noexcept {
+#if MPT_OS_WINDOWS
+		return GatherWindowsVersion();
+#else  // !MPT_OS_WINDOWS
+		return mpt::osinfo::windows::Version::NoWindows();
+#endif // MPT_OS_WINDOWS
+	}
+
+public:
+	bool IsWindows() const noexcept {
+		return m_SystemIsWindows;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		return m_System < version;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		return m_ServicePack < servicePack;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		return m_Build < build;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		if (m_ServicePack > servicePack) {
+			return false;
+		}
+		if (m_ServicePack < servicePack) {
+			return true;
+		}
+		return m_Build < build;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		return m_System >= version;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		return m_ServicePack >= servicePack;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		return m_Build >= build;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		if (m_ServicePack < servicePack) {
+			return false;
+		}
+		if (m_ServicePack > servicePack) {
+			return true;
+		}
+		return m_Build >= build;
+	}
+
+	mpt::osinfo::windows::Version::System GetSystem() const noexcept {
+		return m_System;
+	}
+
+	mpt::osinfo::windows::Version::ServicePack GetServicePack() const noexcept {
+		return m_ServicePack;
+	}
+
+	mpt::osinfo::windows::Version::Build GetBuild() const noexcept {
+		return m_Build;
+	}
+
+	mpt::osinfo::windows::Version::TypeId GetTypeId() const noexcept {
+		return m_Type;
+	}
+
+}; // class Version
+
+
+
+} // namespace windows
+
+} // namespace osinfo
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_OSINFO_WINDOWS_VERSION_HPP

Property changes on: src/mpt/osinfo/windows_version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/out_of_memory/out_of_memory.hpp
===================================================================
--- src/mpt/out_of_memory/out_of_memory.hpp	(nonexistent)
+++ src/mpt/out_of_memory/out_of_memory.hpp	(working copy)
@@ -0,0 +1,77 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP
+#define MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <exception>
+#if !MPT_DETECTED_MFC
+#include <new>
+#endif // !MPT_DETECTED_MFC
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Exception handling helpers, because MFC requires explicit deletion of the exception object,
+// Thus, always call exactly one of mpt::rethrow_out_of_memory(e) or mpt::delete_out_of_memory(e).
+
+#if MPT_DETECTED_MFC
+
+using out_of_memory = CMemoryException *;
+
+[[noreturn]] inline void throw_out_of_memory() {
+	AfxThrowMemoryException();
+}
+
+[[noreturn]] inline void rethrow_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+	throw;
+}
+
+inline void delete_out_of_memory(out_of_memory & e) {
+	if (e) {
+		e->Delete();
+		e = nullptr;
+	}
+}
+
+#else // !MPT_DETECTED_MFC
+
+using out_of_memory = const std::bad_alloc &;
+
+[[noreturn]] inline void throw_out_of_memory() {
+	throw std::bad_alloc();
+}
+
+[[noreturn]] inline void rethrow_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+	throw;
+}
+
+inline void delete_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+}
+
+#endif // MPT_DETECTED_MFC
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP

Property changes on: src/mpt/out_of_memory/out_of_memory.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/crand.hpp
===================================================================
--- src/mpt/random/crand.hpp	(nonexistent)
+++ src/mpt/random/crand.hpp	(working copy)
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_CRAND_HPP
+#define MPT_RANDOM_CRAND_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/numeric.hpp"
+#include "mpt/random/random.hpp"
+
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class crand {
+public:
+	using state_type = void;
+	using result_type = int;
+
+private:
+	static void reseed(uint32 seed) {
+		std::srand(seed);
+	}
+
+public:
+	template <typename Trd>
+	static void reseed(Trd & rd) {
+		reseed(mpt::random<uint32>(rd));
+	}
+
+public:
+	crand() = default;
+	explicit crand(const std::string &) {
+		return;
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return 0;
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return RAND_MAX;
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return mpt::lower_bound_entropy_bits(RAND_MAX);
+	}
+	result_type operator()() {
+		return std::rand();
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_CRAND_HPP

Property changes on: src/mpt/random/crand.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/default_engines.hpp
===================================================================
--- src/mpt/random/default_engines.hpp	(nonexistent)
+++ src/mpt/random/default_engines.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_DEFAULT_ENGINES_HPP
+#define MPT_RANDOM_DEFAULT_ENGINES_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/engine.hpp"
+#include "mpt/random/engine_lcg.hpp"
+
+#include <random>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+using deterministic_fast_engine = mpt::lcg_msvc;
+using deterministic_good_engine = mpt::lcg_musl;
+
+// We cannot use std::minstd_rand here because it has not a power-of-2 sized
+// output domain which we rely upon.
+using fast_engine = mpt::lcg_msvc; // about 3 ALU operations, ~32bit of state, suited for inner loops
+using good_engine = std::ranlux48;
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_DEFAULT_ENGINES_HPP

Property changes on: src/mpt/random/default_engines.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/device.hpp
===================================================================
--- src/mpt/random/device.hpp	(nonexistent)
+++ src/mpt/random/device.hpp	(working copy)
@@ -0,0 +1,303 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_DEVICE_HPP
+#define MPT_RANDOM_DEVICE_HPP
+
+
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/crc/crc.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/mutex/mutex.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/random/engine.hpp"
+#include "mpt/random/engine_lcg.hpp"
+#include "mpt/random/random.hpp"
+
+#include <chrono>
+#include <limits>
+#include <memory>
+#include <random>
+#include <string>
+
+#include <cmath>
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+inline constexpr uint32 DETERMINISTIC_RNG_SEED = 3141592653u; // pi
+
+
+
+template <typename T>
+struct default_radom_seed_hash {
+};
+
+template <>
+struct default_radom_seed_hash<uint8> {
+	using type = mpt::crc16;
+};
+
+template <>
+struct default_radom_seed_hash<uint16> {
+	using type = mpt::crc16;
+};
+
+template <>
+struct default_radom_seed_hash<uint32> {
+	using type = mpt::crc32c;
+};
+
+template <>
+struct default_radom_seed_hash<uint64> {
+	using type = mpt::crc64_jones;
+};
+
+
+class prng_random_device_time_seeder {
+
+public:
+	template <typename T>
+	inline T generate_seed() {
+		// Note: CRC is actually not that good a choice here, but it is simple and we
+		// already have an implementaion available. Better choices for mixing entropy
+		// would be a hash function with proper avalanche characteristics or a block
+		// or stream cipher with any pre-choosen random key and IV. The only aspect we
+		// really need here is whitening of the bits.
+		typename mpt::default_radom_seed_hash<T>::type hash;
+
+		{
+			uint64be time;
+			time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock().now().time_since_epoch()).count();
+			std::byte bytes[sizeof(time)];
+			std::memcpy(bytes, &time, sizeof(time));
+			hash(std::begin(bytes), std::end(bytes));
+		}
+#if !defined(MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK)
+		// Avoid std::chrono::high_resolution_clock on Emscripten because availability is problematic in AudioWorklet context.
+		{
+			uint64be time;
+			time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock().now().time_since_epoch()).count();
+			std::byte bytes[sizeof(time)];
+			std::memcpy(bytes, &time, sizeof(time));
+			hash(std::begin(bytes), std::end(bytes));
+		}
+#endif // !MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK
+
+		return static_cast<T>(hash.result());
+	}
+
+public:
+	prng_random_device_time_seeder() = default;
+};
+
+
+//  C++11 std::random_device may be implemented as a deterministic PRNG.
+//  There is no way to seed this PRNG and it is allowed to be seeded with the
+// same value on each program invocation. This makes std::random_device
+// completely useless even as a non-cryptographic entropy pool.
+//  We fallback to time-seeded std::mt19937 if std::random_device::entropy() is
+// 0 or less.
+class sane_random_device {
+private:
+	mpt::mutex m;
+	std::string token;
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+	std::unique_ptr<std::random_device> prd;
+	bool rd_reliable{false};
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	std::unique_ptr<std::mt19937> rd_fallback;
+
+public:
+	using result_type = unsigned int;
+
+private:
+	void init_fallback() {
+		if (!rd_fallback) {
+			if (token.length() > 0) {
+				uint64 seed_val = mpt::prng_random_device_time_seeder().generate_seed<uint64>();
+				std::vector<unsigned int> seeds;
+				seeds.push_back(static_cast<uint32>(seed_val >> 32));
+				seeds.push_back(static_cast<uint32>(seed_val >> 0));
+				for (std::size_t i = 0; i < token.length(); ++i) {
+					seeds.push_back(static_cast<unsigned int>(static_cast<unsigned char>(token[i])));
+				}
+				std::seed_seq seed(seeds.begin(), seeds.end());
+				rd_fallback = std::make_unique<std::mt19937>(seed);
+			} else {
+				uint64 seed_val = mpt::prng_random_device_time_seeder().generate_seed<uint64>();
+				unsigned int seeds[2];
+				seeds[0] = static_cast<uint32>(seed_val >> 32);
+				seeds[1] = static_cast<uint32>(seed_val >> 0);
+				std::seed_seq seed(seeds + 0, seeds + 2);
+				rd_fallback = std::make_unique<std::mt19937>(seed);
+			}
+		}
+	}
+
+public:
+	sane_random_device() {
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		try {
+			prd = std::make_unique<std::random_device>();
+			rd_reliable = ((*prd).entropy() > 0.0);
+		} catch (mpt::out_of_memory e) {
+			mpt::rethrow_out_of_memory(e);
+		} catch (const std::exception &) {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			init_fallback();
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		init_fallback();
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	}
+	sane_random_device(const std::string & token_)
+		: token(token_) {
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		try {
+			prd = std::make_unique<std::random_device>(token);
+			rd_reliable = ((*prd).entropy() > 0.0);
+		} catch (mpt::out_of_memory e) {
+			mpt::rethrow_out_of_memory(e);
+		} catch (const std::exception &) {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			init_fallback();
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		init_fallback();
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	}
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return std::numeric_limits<result_type>::min();
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return std::numeric_limits<result_type>::max();
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return sizeof(result_type) * 8;
+	}
+	result_type operator()() {
+		mpt::lock_guard<mpt::mutex> l(m);
+		result_type result = 0;
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		if (prd) {
+			try {
+				if constexpr (std::random_device::min() != 0 || !mpt::is_mask(std::random_device::max())) {
+					// insane std::random_device
+					//  This implementation is not exactly uniformly distributed but good enough
+					// for OpenMPT.
+					constexpr double rd_min = static_cast<double>(std::random_device::min());
+					constexpr double rd_max = static_cast<double>(std::random_device::max());
+					constexpr double rd_range = rd_max - rd_min;
+					constexpr double rd_size = rd_range + 1.0;
+					const double rd_entropy = std::log2(rd_size);
+					const int iterations = static_cast<int>(std::ceil(result_bits() / rd_entropy));
+					double tmp = 0.0;
+					for (int i = 0; i < iterations; ++i) {
+						tmp = (tmp * rd_size) + (static_cast<double>((*prd)()) - rd_min);
+					}
+					double result_01 = std::floor(tmp / std::pow(rd_size, iterations));
+					result = static_cast<result_type>(std::floor(result_01 * (static_cast<double>(max() - min()) + 1.0))) + min();
+				} else {
+					// sane std::random_device
+					result = 0;
+					std::size_t rd_bits = mpt::lower_bound_entropy_bits(std::random_device::max());
+					for (std::size_t entropy = 0; entropy < (sizeof(result_type) * 8); entropy += rd_bits) {
+						if (rd_bits < (sizeof(result_type) * 8)) {
+							result = (result << rd_bits) | static_cast<result_type>((*prd)());
+						} else {
+							result = result | static_cast<result_type>((*prd)());
+						}
+					}
+				}
+			} catch (const std::exception &) {
+				rd_reliable = false;
+				init_fallback();
+			}
+		} else {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			// std::random_device is unreliable
+			//  XOR the generated random number with more entropy from the time-seeded
+			// PRNG.
+			//  Note: This is safe even if the std::random_device itself is implemented
+			// as a std::mt19937 PRNG because we are very likely using a different
+			// seed.
+			result ^= mpt::random<result_type>(*rd_fallback);
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		result ^= mpt::random<result_type>(*rd_fallback);
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		return result;
+	}
+};
+
+
+class prng_random_device_deterministic_seeder {
+protected:
+	template <typename T>
+	constexpr T generate_seed() noexcept {
+		return static_cast<T>(mpt::DETERMINISTIC_RNG_SEED);
+	}
+
+protected:
+	prng_random_device_deterministic_seeder() = default;
+};
+
+template <typename Trng = mpt::lcg_musl, typename seeder = mpt::prng_random_device_time_seeder>
+class prng_random_device
+	: private seeder {
+public:
+	using result_type = unsigned int;
+
+private:
+	mpt::mutex m;
+	Trng rng;
+
+public:
+	prng_random_device()
+		: rng(seeder::template generate_seed<typename Trng::state_type>()) {
+		return;
+	}
+	prng_random_device(const std::string &)
+		: rng(seeder::template generate_seed<typename Trng::state_type>()) {
+		return;
+	}
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return std::numeric_limits<unsigned int>::min();
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return std::numeric_limits<unsigned int>::max();
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return sizeof(unsigned int) * 8;
+	}
+	result_type operator()() {
+		mpt::lock_guard<mpt::mutex> l(m);
+		return mpt::random<unsigned int>(rng);
+	}
+};
+
+
+using deterministc_random_device = mpt::prng_random_device<mpt::lcg_musl>;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_DEVICE_HPP

Property changes on: src/mpt/random/device.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/engine.hpp
===================================================================
--- src/mpt/random/engine.hpp	(nonexistent)
+++ src/mpt/random/engine.hpp	(working copy)
@@ -0,0 +1,166 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_ENGINE_HPP
+#define MPT_RANDOM_ENGINE_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/seed.hpp"
+
+#include <memory>
+#include <random>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Trng>
+struct engine_traits {
+	typedef typename Trng::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return Trng::result_bits();
+	}
+	template <typename Trd>
+	static inline Trng make(Trd & rd) {
+		return Trng(rd);
+	}
+};
+
+// C++11 random does not provide any sane way to determine the amount of entropy
+// required to seed a particular engine. VERY STUPID.
+// List the ones we are likely to use.
+
+template <>
+struct engine_traits<std::mt19937> {
+	enum : std::size_t
+	{
+		seed_bits = sizeof(std::mt19937::result_type) * 8 * std::mt19937::state_size
+	};
+	typedef std::mt19937 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		std::unique_ptr<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>> values = std::make_unique<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>>(rd);
+		std::seed_seq seed(values->begin(), values->end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::mt19937_64> {
+	enum : std::size_t
+	{
+		seed_bits = sizeof(std::mt19937_64::result_type) * 8 * std::mt19937_64::state_size
+	};
+	typedef std::mt19937_64 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		std::unique_ptr<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>> values = std::make_unique<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>>(rd);
+		std::seed_seq seed(values->begin(), values->end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux24_base> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux24_base::word_size
+	};
+	typedef std::ranlux24_base rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux48_base> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux48_base::word_size
+	};
+	typedef std::ranlux48_base rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux24> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux24_base::word_size
+	};
+	typedef std::ranlux24 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return std::ranlux24_base::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux48> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux48_base::word_size
+	};
+	typedef std::ranlux48 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return std::ranlux48_base::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+
+
+template <typename Trng, typename Trd>
+inline Trng make_prng(Trd & rd) {
+	return mpt::engine_traits<Trng>::make(rd);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_ENGINE_HPP

Property changes on: src/mpt/random/engine.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/engine_lcg.hpp
===================================================================
--- src/mpt/random/engine_lcg.hpp	(nonexistent)
+++ src/mpt/random/engine_lcg.hpp	(working copy)
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_ENGINE_LCG_HPP
+#define MPT_RANDOM_ENGINE_LCG_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/random.hpp"
+
+#include <random>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4724) // potential mod by 0
+#endif                          // MPT_COMPILER_MSVC
+
+template <typename Tstate, typename Tvalue, Tstate m, Tstate a, Tstate c, Tstate result_mask, int result_shift, int result_bits_>
+class lcg_engine {
+public:
+	typedef Tstate state_type;
+	typedef Tvalue result_type;
+
+private:
+	state_type state;
+
+public:
+	template <typename Trng>
+	explicit inline lcg_engine(Trng & rd)
+		: state(mpt::random<state_type>(rd)) {
+		operator()(); // we return results from the current state and update state after returning. results in better pipelining.
+	}
+	explicit inline lcg_engine(state_type seed)
+		: state(seed) {
+		operator()(); // we return results from the current state and update state after returning. results in better pipelining.
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return static_cast<result_type>(0);
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		static_assert(((result_mask >> result_shift) << result_shift) == result_mask);
+		return static_cast<result_type>(result_mask >> result_shift);
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		static_assert(((static_cast<Tstate>(1) << result_bits_) - 1) == (result_mask >> result_shift));
+		return result_bits_;
+	}
+	inline result_type operator()() {
+		// we return results from the current state and update state after returning. results in better pipelining.
+		state_type s = state;
+		result_type result = static_cast<result_type>((s & result_mask) >> result_shift);
+		s = mpt::modulo_if_not_zero<state_type, m>((a * s) + c);
+		state = s;
+		return result;
+	}
+};
+
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+
+typedef lcg_engine<uint32, uint16, 0u, 214013u, 2531011u, 0x7fff0000u, 16, 15> lcg_msvc;
+typedef lcg_engine<uint32, uint16, 0x80000000u, 1103515245u, 12345u, 0x7fff0000u, 16, 15> lcg_c99;
+typedef lcg_engine<uint64, uint32, 0ull, 6364136223846793005ull, 1ull, 0xffffffff00000000ull, 32, 32> lcg_musl;
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_ENGINE_LCG_HPP

Property changes on: src/mpt/random/engine_lcg.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/random.hpp
===================================================================
--- src/mpt/random/random.hpp	(nonexistent)
+++ src/mpt/random/random.hpp	(working copy)
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_RANDOM_HPP
+#define MPT_RANDOM_RANDOM_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/engine.hpp"
+
+#include <type_traits>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T, typename Trng>
+inline T random(Trng & rng) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < (sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	return static_cast<T>(result);
+}
+
+template <typename T, std::size_t required_entropy_bits, typename Trng>
+inline T random(Trng & rng) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < std::min(required_entropy_bits, sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	if constexpr (required_entropy_bits >= (sizeof(T) * 8)) {
+		return static_cast<T>(result);
+	} else {
+		return static_cast<T>(result & ((static_cast<unsigned_T>(1) << required_entropy_bits) - static_cast<unsigned_T>(1)));
+	}
+}
+
+template <typename T, typename Trng>
+inline T random(Trng & rng, std::size_t required_entropy_bits) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < std::min(required_entropy_bits, sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	if (required_entropy_bits >= (sizeof(T) * 8)) {
+		return static_cast<T>(result);
+	} else {
+		return static_cast<T>(result & ((static_cast<unsigned_T>(1) << required_entropy_bits) - static_cast<unsigned_T>(1)));
+	}
+}
+
+template <typename T>
+struct uniform_real_distribution {
+private:
+	T a;
+	T b;
+
+public:
+	inline uniform_real_distribution(T a_, T b_)
+		: a(a_)
+		, b(b_) {
+		return;
+	}
+	template <typename Trng>
+	inline T operator()(Trng & rng) const {
+		const int mantissa_bits = std::numeric_limits<T>::digits;
+		return ((b - a) * static_cast<T>(mpt::random<uint64, mantissa_bits>(rng)) / static_cast<T>((static_cast<uint64>(1u) << mantissa_bits))) + a;
+	}
+};
+
+
+template <typename T, typename Trng>
+inline T random(Trng & rng, T min, T max) {
+	static_assert(!std::numeric_limits<T>::is_integer);
+	typedef mpt::uniform_real_distribution<T> dis_type;
+	dis_type dis(min, max);
+	return static_cast<T>(dis(rng));
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_RANDOM_HPP

Property changes on: src/mpt/random/random.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/seed.hpp
===================================================================
--- src/mpt/random/seed.hpp	(nonexistent)
+++ src/mpt/random/seed.hpp	(working copy)
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_SEED_HPP
+#define MPT_RANDOM_SEED_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <std::size_t N>
+class seed_seq_values {
+private:
+	std::array<unsigned int, N> seeds;
+
+public:
+	template <typename Trd>
+	explicit seed_seq_values(Trd & rd) {
+		for (std::size_t i = 0; i < N; ++i) {
+			seeds[i] = rd();
+		}
+	}
+	const unsigned int * begin() const {
+		return seeds.data();
+	}
+	const unsigned int * end() const {
+		return seeds.data() + N;
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_SEED_HPP

Property changes on: src/mpt/random/seed.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/tests/tests_random.hpp
===================================================================
--- src/mpt/random/tests/tests_random.hpp	(nonexistent)
+++ src/mpt/random/tests/tests_random.hpp	(working copy)
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_RANDOM_HPP
+#define MPT_BASE_TESTS_RANDOM_HPP
+
+
+
+#include "mpt/base/algorithm.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/random/random.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_random{
+	"mpt/random",
+	[](mpt::test::context & context) {
+		mpt::sane_random_device rd;
+		mpt::good_engine prng = mpt::make_prng<mpt::good_engine>(rd);
+
+		bool failed = false;
+
+		for (std::size_t i = 0; i < 10000; ++i) {
+
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 7>(prng), 0u, 127u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 8>(prng), 0u, 255u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 9>(prng), 0u, 511u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint64, 1>(prng), 0u, 1u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 7), 0u, 127u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 8), 0u, 255u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 9), 0u, 511u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint64>(prng, 1), 0u, 1u);
+
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 7>(prng), 0, 127);
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 8>(prng), 0, 255);
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 9>(prng), 0, 511);
+			failed = failed || !mpt::is_in_range(mpt::random<int64, 1>(prng), 0, 1);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 7), 0, 127);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 8), 0, 255);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 9), 0, 511);
+			failed = failed || !mpt::is_in_range(mpt::random<int64>(prng, 1), 0, 1);
+
+			failed = failed || !mpt::is_in_range(mpt::random<float>(prng, 0.0f, 1.0f), 0.0f, 1.0f);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 0.0, 1.0), 0.0, 1.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 1.0), -1.0, 1.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 0.0), -1.0, 0.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 1.0, 2.0), 1.0, 2.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 1.0, 3.0), 1.0, 3.0);
+		}
+
+		MPT_TEST_EXPECT_EXPR(!failed);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_RANDOM_HPP

Property changes on: src/mpt/random/tests/tests_random.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/buffer.hpp
===================================================================
--- src/mpt/string/buffer.hpp	(nonexistent)
+++ src/mpt/string/buffer.hpp	(working copy)
@@ -0,0 +1,344 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_BUFFER_HPP
+#define MPT_STRING_BUFFER_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/types.hpp"
+
+#include <algorithm>
+#include <array>
+#include <string>
+#include <string_view>
+#include <type_traits>
+
+#include <cassert>
+#include <cstddef>
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+
+template <typename Tstring, typename Tchar>
+class StringBufRefImpl {
+private:
+	Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit StringBufRefImpl(Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		static_assert(sizeof(Tchar) == sizeof(typename Tstring::value_type));
+		assert(size > 0);
+	}
+	StringBufRefImpl(const StringBufRefImpl &) = delete;
+	StringBufRefImpl(StringBufRefImpl &&) = default;
+	StringBufRefImpl & operator=(const StringBufRefImpl &) = delete;
+	StringBufRefImpl & operator=(StringBufRefImpl &&) = delete;
+	operator Tstring() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return Tstring(buf, buf + len);
+	}
+	explicit operator std::basic_string_view<Tchar>() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return std::basic_string_view<Tchar>(buf, buf + len);
+	}
+	bool empty() const {
+		return buf[0] == Tchar('\0');
+	}
+	StringBufRefImpl & operator=(const Tstring & str) {
+		std::copy(str.data(), str.data() + std::min(str.length(), size - 1), buf);
+		std::fill(buf + std::min(str.length(), size - 1), buf + size, Tchar('\0'));
+		return *this;
+	}
+};
+
+template <typename Tstring, typename Tchar>
+class StringBufRefImpl<Tstring, const Tchar> {
+private:
+	const Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit StringBufRefImpl(const Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		static_assert(sizeof(Tchar) == sizeof(typename Tstring::value_type));
+		assert(size > 0);
+	}
+	StringBufRefImpl(const StringBufRefImpl &) = delete;
+	StringBufRefImpl(StringBufRefImpl &&) = default;
+	StringBufRefImpl & operator=(const StringBufRefImpl &) = delete;
+	StringBufRefImpl & operator=(StringBufRefImpl &&) = delete;
+	operator Tstring() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return Tstring(buf, buf + len);
+	}
+	explicit operator std::basic_string_view<Tchar>() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return std::basic_string_view<Tchar>(buf, len);
+	}
+	bool empty() const {
+		return buf[0] == Tchar('\0');
+	}
+};
+
+
+
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tstring, typename Tchar>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<Tstring, Tchar>(buf.data(), size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<Tstring, Tchar>(buf, size);
+}
+template <typename Tstring, typename Tchar>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<Tstring, Tchar>(buf, size);
+}
+
+
+
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf, size);
+}
+
+
+
+#if MPT_OS_WINDOWS
+
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf, size);
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_DETECTED_MFC
+
+template <typename Tchar>
+class CStringBufRefImpl {
+private:
+	Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit CStringBufRefImpl(Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		assert(size > 0);
+	}
+	CStringBufRefImpl(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl(CStringBufRefImpl &&) = default;
+	CStringBufRefImpl & operator=(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl & operator=(CStringBufRefImpl &&) = delete;
+	operator CString() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return CString(buf, mpt::saturate_cast<int>(len));
+	}
+	CStringBufRefImpl & operator=(const CString & str) {
+		std::copy(str.GetString(), str.GetString() + std::min(static_cast<std::size_t>(str.GetLength()), size - 1), buf);
+		std::fill(buf + std::min(static_cast<std::size_t>(str.GetLength()), size - 1), buf + size, Tchar('\0'));
+		return *this;
+	}
+};
+
+template <typename Tchar>
+class CStringBufRefImpl<const Tchar> {
+private:
+	const Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit CStringBufRefImpl(const Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		assert(size > 0);
+	}
+	CStringBufRefImpl(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl(CStringBufRefImpl &&) = default;
+	CStringBufRefImpl & operator=(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl & operator=(CStringBufRefImpl &&) = delete;
+	operator CString() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return CString(buf, mpt::saturate_cast<int>(len));
+	}
+};
+
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const std::array<Tchar, size> & buf) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const Tchar (&buf)[size]) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const Tchar * buf, std::size_t size) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(std::array<Tchar, size> & buf) {
+	return CStringBufRefImpl<Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(Tchar (&buf)[size]) {
+	return CStringBufRefImpl<Tchar>(buf, size);
+}
+template <typename Tchar>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(Tchar * buf, std::size_t size) {
+	return CStringBufRefImpl<Tchar>(buf, size);
+}
+
+#endif // MPT_DETECTED_MFC
+
+
+
+template <std::size_t len>
+struct charbuf {
+public:
+	using Tchar = char;
+	using char_type = Tchar;
+	using string_type = std::basic_string<Tchar>;
+	using string_view_type = std::basic_string_view<Tchar>;
+	constexpr std::size_t static_length() const {
+		return len;
+	}
+
+public:
+	Tchar buf[len];
+
+public:
+	charbuf() {
+		std::fill(std::begin(buf), std::end(buf), Tchar('\0'));
+	}
+	charbuf(const charbuf &) = default;
+	charbuf(charbuf &&) = default;
+	charbuf & operator=(const charbuf &) = default;
+	charbuf & operator=(charbuf &&) = default;
+	const Tchar & operator[](std::size_t i) const {
+		return buf[i];
+	}
+	std::string str() const {
+		return static_cast<std::string>(*this);
+	}
+	operator string_type() const {
+		return mpt::ReadAutoBuf(buf);
+	}
+	explicit operator string_view_type() const {
+		return static_cast<string_view_type>(mpt::ReadAutoBuf(buf));
+	}
+	bool empty() const {
+		return mpt::ReadAutoBuf(buf).empty();
+	}
+	charbuf & operator=(const string_type & str) {
+		mpt::WriteAutoBuf(buf) = str;
+		return *this;
+	}
+
+public:
+	friend bool operator!=(const charbuf & a, const charbuf & b) {
+		return static_cast<string_view_type>(a) != static_cast<string_view_type>(b);
+	}
+	friend bool operator!=(const std::string & a, const charbuf & b) {
+		return a != static_cast<string_view_type>(b);
+	}
+	friend bool operator!=(const charbuf & a, const std::string & b) {
+		return static_cast<string_view_type>(a) != b;
+	}
+	friend bool operator==(const charbuf & a, const charbuf & b) {
+		return static_cast<string_view_type>(a) == static_cast<string_view_type>(b);
+	}
+	friend bool operator==(const std::string & a, const charbuf & b) {
+		return a == static_cast<string_view_type>(b);
+	}
+	friend bool operator==(const charbuf & a, const std::string & b) {
+		return static_cast<string_view_type>(a) == b;
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_BUFFER_HPP

Property changes on: src/mpt/string/buffer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/convert.hpp
===================================================================
--- src/mpt/string/convert.hpp	(nonexistent)
+++ src/mpt/string/convert.hpp	(working copy)
@@ -0,0 +1,1131 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_CONVERT_HPP
+#define MPT_STRING_CONVERT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#include <locale>
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#include <stdexcept>
+#include <string>
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#include <type_traits>
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#include <vector>
+
+#if MPT_OS_DJGPP
+#include <cstring>
+#endif // MPT_OS_DJGPP
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_DJGPP
+#include <dpmi.h>
+#endif // MPT_OS_DJGPP
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+/*
+default 1:1 mapping
+inline constexpr char32_t CharsetTableISO8859_1[256] = {
+	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
+	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
+	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
+	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
+	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
+	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
+	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
+	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
+	0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f,
+	0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f,
+	0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
+	0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf,
+	0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
+	0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
+	0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
+	0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
+};
+*/
+
+inline constexpr char32_t CharsetTableISO8859_15[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+	0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+	0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+	0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+	0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
+	0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+	0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+	0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+	0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
+
+inline constexpr char32_t CharsetTableWindows1252[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+	0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f,
+	0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178,
+	0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+	0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+	0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+	0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+	0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+	0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
+
+inline constexpr char32_t CharsetTableCP850[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+	0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+	0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00F8, 0x00a3, 0x00D8, 0x00D7, 0x0192,
+	0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x00AE, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00A2, 0x00A5, 0x2510,
+	0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00E3, 0x00C3, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00A4,
+	0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250c, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580,
+	0x00D3, 0x00df, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00b5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4,
+	0x00AD, 0x00b1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00f7, 0x00B8, 0x00b0, 0x00A8, 0x00b7, 0x00B9, 0x00B3, 0x00b2, 0x25a0, 0x00a0};
+
+inline constexpr char32_t CharsetTableCP437[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+	0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+	0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
+	0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
+	0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
+	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
+	0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229,
+	0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0};
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_8bit(const Tsrcstring & str, const char32_t (&table)[256], mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		std::size_t c = static_cast<std::size_t>(mpt::char_value(str[i]));
+		if (c < std::size(table)) {
+			res.push_back(static_cast<mpt::widechar>(table[c]));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_8bit(const mpt::widestring & str, const char32_t (&table)[256], char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		bool found = false;
+		// Try non-control characters first.
+		// In cases where there are actual characters mirrored in this range (like in AMS/AMS2 character sets),
+		// characters in the common range are preferred this way.
+		for (std::size_t x = 0x20; x < std::size(table); ++x) {
+			if (c == table[x]) {
+				res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
+				found = true;
+				break;
+			}
+		}
+		if (!found) {
+			// try control characters
+			for (std::size_t x = 0x00; x < std::size(table) && x < 0x20; ++x) {
+				if (c == table[x]) {
+					res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
+					found = true;
+					break;
+				}
+			}
+		}
+		if (!found) {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_ascii(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		uint8 c = str[i];
+		if (c <= 0x7f) {
+			res.push_back(static_cast<mpt::widechar>(static_cast<uint32>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_ascii(const mpt::widestring & str, char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		if (c <= 0x7f) {
+			res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_iso8859_1(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	MPT_UNUSED(replacement);
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		uint8 c = str[i];
+		res.push_back(static_cast<mpt::widechar>(static_cast<uint32>(c)));
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_iso8859_1(const mpt::widestring & str, char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		if (c <= 0xff) {
+			res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_utf8(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	const Tsrcstring & in = str;
+	mpt::widestring out;
+	// state:
+	std::size_t charsleft = 0;
+	char32_t ucs4 = 0;
+	for (uint8 c : in) {
+		if (charsleft == 0) {
+			if ((c & 0x80) == 0x00) {
+				out.push_back(static_cast<mpt::widechar>(c));
+			} else if ((c & 0xE0) == 0xC0) {
+				ucs4 = c & 0x1F;
+				charsleft = 1;
+			} else if ((c & 0xF0) == 0xE0) {
+				ucs4 = c & 0x0F;
+				charsleft = 2;
+			} else if ((c & 0xF8) == 0xF0) {
+				ucs4 = c & 0x07;
+				charsleft = 3;
+			} else {
+				out.push_back(replacement);
+				ucs4 = 0;
+				charsleft = 0;
+			}
+		} else {
+			if ((c & 0xC0) != 0x80) {
+				out.push_back(replacement);
+				ucs4 = 0;
+				charsleft = 0;
+			}
+			ucs4 <<= 6;
+			ucs4 |= c & 0x3F;
+			charsleft--;
+			if (charsleft == 0) {
+				if constexpr (sizeof(mpt::widechar) == 2) {
+					if (ucs4 > 0x1fffff) {
+						out.push_back(replacement);
+						ucs4 = 0;
+						charsleft = 0;
+					}
+					if (ucs4 <= 0xffff) {
+						out.push_back(static_cast<mpt::widechar>(ucs4));
+					} else {
+						uint32 surrogate = static_cast<uint32>(ucs4) - 0x10000;
+						uint16 hi_sur = static_cast<uint16>((0x36 << 10) | ((surrogate >> 10) & ((1 << 10) - 1)));
+						uint16 lo_sur = static_cast<uint16>((0x37 << 10) | ((surrogate >> 0) & ((1 << 10) - 1)));
+						out.push_back(hi_sur);
+						out.push_back(lo_sur);
+					}
+				} else {
+					out.push_back(static_cast<mpt::widechar>(ucs4));
+				}
+				ucs4 = 0;
+			}
+		}
+	}
+	if (charsleft != 0) {
+		out.push_back(replacement);
+		ucs4 = 0;
+		charsleft = 0;
+	}
+	return out;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_utf8(const mpt::widestring & str, char replacement = '?') {
+	const mpt::widestring & in = str;
+	Tdststring out;
+	for (std::size_t i = 0; i < in.length(); i++) {
+		mpt::widechar wc = in[i];
+		char32_t ucs4 = 0;
+		if constexpr (sizeof(mpt::widechar) == 2) {
+			uint16 c = static_cast<uint16>(wc);
+			if (i + 1 < in.length()) {
+				// check for surrogate pair
+				uint16 hi_sur = in[i + 0];
+				uint16 lo_sur = in[i + 1];
+				if (hi_sur >> 10 == 0x36 && lo_sur >> 10 == 0x37) {
+					// surrogate pair
+					++i;
+					hi_sur &= (1 << 10) - 1;
+					lo_sur &= (1 << 10) - 1;
+					ucs4 = (static_cast<uint32>(hi_sur) << 10) | (static_cast<uint32>(lo_sur) << 0);
+				} else {
+					// no surrogate pair
+					ucs4 = static_cast<char32_t>(c);
+				}
+			} else {
+				// no surrogate possible
+				ucs4 = static_cast<char32_t>(c);
+			}
+		} else {
+			ucs4 = static_cast<char32_t>(wc);
+		}
+		if (ucs4 > 0x1fffff) {
+			out.push_back(replacement);
+			continue;
+		}
+		uint8 utf8[6];
+		std::size_t numchars = 0;
+		for (numchars = 0; numchars < 6; numchars++) {
+			utf8[numchars] = ucs4 & 0x3F;
+			ucs4 >>= 6;
+			if (ucs4 == 0) {
+				break;
+			}
+		}
+		numchars++;
+		if (numchars == 1) {
+			out.push_back(utf8[0]);
+			continue;
+		}
+		if (numchars == 2 && utf8[numchars - 1] == 0x01) {
+			// generate shortest form
+			out.push_back(utf8[0] | 0x40);
+			continue;
+		}
+		std::size_t charsleft = numchars;
+		while (charsleft > 0) {
+			if (charsleft == numchars) {
+				out.push_back(utf8[charsleft - 1] | (((1 << numchars) - 1) << (8 - numchars)));
+			} else {
+				// cppcheck false-positive
+				// cppcheck-suppress arrayIndexOutOfBounds
+				out.push_back(utf8[charsleft - 1] | 0x80);
+			}
+			charsleft--;
+		}
+	}
+	return out;
+}
+
+
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring utf32_from_utf16(const Tsrcstring & in, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == 2);
+	static_assert(sizeof(typename Tdststring::value_type) == 4);
+	MPT_UNUSED(replacement);
+	Tdststring out;
+	out.reserve(in.length());
+	for (std::size_t i = 0; i < in.length(); i++) {
+		char16_t wc = static_cast<char16_t>(static_cast<uint16>(in[i]));
+		char32_t ucs4 = 0;
+		uint16 c = static_cast<uint16>(wc);
+		if (i + 1 < in.length()) {
+			// check for surrogate pair
+			uint16 hi_sur = in[i + 0];
+			uint16 lo_sur = in[i + 1];
+			if (hi_sur >> 10 == 0x36 && lo_sur >> 10 == 0x37) {
+				// surrogate pair
+				++i;
+				hi_sur &= (1 << 10) - 1;
+				lo_sur &= (1 << 10) - 1;
+				ucs4 = (static_cast<uint32>(hi_sur) << 10) | (static_cast<uint32>(lo_sur) << 0);
+			} else {
+				// no surrogate pair
+				ucs4 = static_cast<char32_t>(c);
+			}
+		} else {
+			// no surrogate possible
+			ucs4 = static_cast<char32_t>(c);
+		}
+		out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint32>(ucs4)));
+	}
+	return out;
+}
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring utf16_from_utf32(const Tsrcstring & in, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == 4);
+	static_assert(sizeof(typename Tdststring::value_type) == 2);
+	Tdststring out;
+	out.reserve(in.length());
+	for (std::size_t i = 0; i < in.length(); i++) {
+		char32_t ucs4 = static_cast<char32_t>(static_cast<uint32>(in[i]));
+		if (ucs4 > 0x1fffff) {
+			out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint16>(replacement)));
+			ucs4 = 0;
+		}
+		if (ucs4 <= 0xffff) {
+			out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint16>(ucs4)));
+		} else {
+			uint32 surrogate = static_cast<uint32>(ucs4) - 0x10000;
+			uint16 hi_sur = static_cast<uint16>((0x36 << 10) | ((surrogate >> 10) & ((1 << 10) - 1)));
+			uint16 lo_sur = static_cast<uint16>((0x37 << 10) | ((surrogate >> 0) & ((1 << 10) - 1)));
+			out.push_back(static_cast<typename Tdststring::value_type>(hi_sur));
+			out.push_back(static_cast<typename Tdststring::value_type>(lo_sur));
+		}
+	}
+	return out;
+}
+
+
+
+#if MPT_OS_WINDOWS
+
+inline bool has_codepage(UINT cp) {
+	return IsValidCodePage(cp) ? true : false;
+}
+
+inline bool windows_has_encoding(common_encoding encoding) {
+	bool result = false;
+	switch (encoding) {
+		case common_encoding::utf8:
+			result = has_codepage(CP_UTF8);
+			break;
+		case common_encoding::ascii:
+			result = has_codepage(20127);
+			break;
+		case common_encoding::iso8859_1:
+			result = has_codepage(28591);
+			break;
+		case common_encoding::iso8859_15:
+			result = has_codepage(28605);
+			break;
+		case common_encoding::cp850:
+			result = has_codepage(850);
+			break;
+		case common_encoding::cp437:
+			result = has_codepage(437);
+			break;
+		case common_encoding::windows1252:
+			result = has_codepage(1252);
+			break;
+	}
+	return result;
+}
+
+inline bool windows_has_encoding(logical_encoding encoding) {
+	bool result = false;
+	switch (encoding) {
+		case logical_encoding::locale:
+			result = true;
+			break;
+		case logical_encoding::active_locale:
+			result = false;
+			break;
+	}
+	return result;
+}
+
+inline UINT codepage_from_encoding(logical_encoding encoding) {
+	UINT result = 0;
+	switch (encoding) {
+		case logical_encoding::locale:
+			result = CP_ACP;
+			break;
+		case logical_encoding::active_locale:
+			result = 0;
+			break;
+	}
+	return result;
+}
+
+inline UINT codepage_from_encoding(common_encoding encoding) {
+	UINT result = 0;
+	switch (encoding) {
+		case common_encoding::utf8:
+			result = CP_UTF8;
+			break;
+		case common_encoding::ascii:
+			result = 20127;
+			break;
+		case common_encoding::iso8859_1:
+			result = 28591;
+			break;
+		case common_encoding::iso8859_15:
+			result = 28605;
+			break;
+		case common_encoding::cp850:
+			result = 850;
+			break;
+		case common_encoding::cp437:
+			result = 437;
+			break;
+		case common_encoding::windows1252:
+			result = 1252;
+			break;
+	}
+	return result;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_codepage(UINT codepage, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	Tdststring encoded_string;
+	int required_size = WideCharToMultiByte(codepage, 0, src.data(), mpt::saturate_cast<int>(src.size()), nullptr, 0, nullptr, nullptr);
+	if (required_size > 0) {
+		encoded_string.resize(required_size);
+		WideCharToMultiByte(codepage, 0, src.data(), mpt::saturate_cast<int>(src.size()), reinterpret_cast<CHAR *>(encoded_string.data()), required_size, nullptr, nullptr);
+	}
+	return encoded_string;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_codepage(UINT codepage, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	mpt::widestring decoded_string;
+	int required_size = MultiByteToWideChar(codepage, 0, reinterpret_cast<const CHAR *>(src.data()), mpt::saturate_cast<int>(src.size()), nullptr, 0);
+	if (required_size > 0) {
+		decoded_string.resize(required_size);
+		MultiByteToWideChar(codepage, 0, reinterpret_cast<const CHAR *>(src.data()), mpt::saturate_cast<int>(src.size()), decoded_string.data(), required_size);
+	}
+	return decoded_string;
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_OS_DJGPP
+
+inline common_encoding djgpp_get_locale_encoding() {
+	uint16 active_codepage = 437;
+	uint16 system_codepage = 437;
+	__dpmi_regs regs;
+	std::memset(&regs, 0, sizeof(__dpmi_regs));
+	regs.x.ax = 0x6601;
+	if (__dpmi_int(0x21, &regs) == 0) {
+		int cf = (regs.x.flags >> 0) & 1;
+		if (cf == 0) {
+			active_codepage = regs.x.bx;
+			system_codepage = regs.x.dx;
+		}
+	}
+	common_encoding result = common_encoding::cp437;
+	if (active_codepage == 0) {
+		result = common_encoding::cp437;
+	} else if (active_codepage == 437) {
+		result = common_encoding::cp437;
+	} else if (active_codepage == 850) {
+		result = common_encoding::cp850;
+	} else if (system_codepage == 437) {
+		result = common_encoding::cp437;
+	} else if (system_codepage == 850) {
+		result = common_encoding::cp850;
+	} else {
+		result = common_encoding::cp437;
+	}
+	return result;
+}
+
+#endif // MPT_OS_DJGPP
+
+
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+
+// Note:
+//
+//  std::codecvt::out in LLVM libc++ does not advance in and out pointers when
+// running into a non-convertible character. This can happen when no locale is
+// set on FreeBSD or MacOSX. This behaviour violates the C++ standard.
+//
+//  We apply the following (albeit costly, even on other platforms) work-around:
+//  If the conversion errors out and does not advance the pointers at all, we
+// retry the conversion with a space character prepended to the string. If it
+// still does error out, we retry the whole conversion character by character.
+//  This is costly even on other platforms in one single case: The first
+// character is an invalid Unicode code point or otherwise not convertible. Any
+// following non-convertible characters are not a problem.
+
+inline std::wstring decode_locale_impl(const std::string & str, const std::locale & locale, wchar_t replacement = L'\uFFFD', int retry = 0, bool * progress = nullptr) {
+	if (str.empty()) {
+		return std::wstring();
+	}
+	std::vector<wchar_t> out;
+	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
+	std::mbstate_t state = std::mbstate_t();
+	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
+	codecvt_type::result result = codecvt_type::partial;
+	const char * in_begin = str.data();
+	const char * in_end = in_begin + str.size();
+	out.resize((in_end - in_begin) * (mpt::saturate_cast<std::size_t>(facet.max_length()) + 1));
+	wchar_t * out_begin = out.data();
+	wchar_t * out_end = out.data() + out.size();
+	const char * in_next = nullptr;
+	wchar_t * out_next = nullptr;
+	do {
+		if (retry == 2) {
+			for (;;) {
+				in_next = nullptr;
+				out_next = nullptr;
+				result = facet.in(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
+				if (result == codecvt_type::partial && in_next == in_begin + 1) {
+					in_begin = in_next;
+					out_begin = out_next;
+					continue;
+				} else {
+					break;
+				}
+			}
+		} else {
+			in_next = nullptr;
+			out_next = nullptr;
+			result = facet.in(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
+		}
+		if (result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end)) {
+			out.resize(out.size() * 2);
+			in_begin = in_next;
+			out_begin = out.data() + (out_next - out_begin);
+			out_end = out.data() + out.size();
+			continue;
+		}
+		if (retry == 0) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				bool made_progress = true;
+				decode_locale_impl(std::string(" ") + str, locale, replacement, 1, &made_progress);
+				if (!made_progress) {
+					return decode_locale_impl(str, locale, replacement, 2);
+				}
+			}
+		} else if (retry == 1) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				*progress = false;
+			} else {
+				*progress = true;
+			}
+			return std::wstring();
+		}
+		if (result == codecvt_type::error) {
+			++in_next;
+			*out_next = replacement;
+			++out_next;
+		}
+		in_begin = in_next;
+		out_begin = out_next;
+	} while ((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
+	return std::wstring(out.data(), out_next);
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_locale(const std::locale & locale, const Tsrcstring & src) {
+	if constexpr (std::is_same<Tsrcstring, std::string>::value) {
+		return decode_locale_impl(src, locale);
+	} else {
+		return decode_locale_impl(std::string(src.begin(), src.end()), locale);
+	}
+}
+
+inline std::string encode_locale_impl(const std::wstring & str, const std::locale & locale, char replacement = '?', int retry = 0, bool * progress = nullptr) {
+	if (str.empty()) {
+		return std::string();
+	}
+	std::vector<char> out;
+	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
+	std::mbstate_t state = std::mbstate_t();
+	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
+	codecvt_type::result result = codecvt_type::partial;
+	const wchar_t * in_begin = str.data();
+	const wchar_t * in_end = in_begin + str.size();
+	out.resize((in_end - in_begin) * (mpt::saturate_cast<std::size_t>(facet.max_length()) + 1));
+	char * out_begin = out.data();
+	char * out_end = out.data() + out.size();
+	const wchar_t * in_next = nullptr;
+	char * out_next = nullptr;
+	do {
+		if (retry == 2) {
+			for (;;) {
+				in_next = nullptr;
+				out_next = nullptr;
+				result = facet.out(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
+				if (result == codecvt_type::partial && in_next == in_begin + 1) {
+					in_begin = in_next;
+					out_begin = out_next;
+					continue;
+				} else {
+					break;
+				}
+			}
+		} else {
+			in_next = nullptr;
+			out_next = nullptr;
+			result = facet.out(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
+		}
+		if (result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end)) {
+			out.resize(out.size() * 2);
+			in_begin = in_next;
+			out_begin = out.data() + (out_next - out_begin);
+			out_end = out.data() + out.size();
+			continue;
+		}
+		if (retry == 0) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				bool made_progress = true;
+				encode_locale_impl(std::wstring(L" ") + str, locale, replacement, 1, &made_progress);
+				if (!made_progress) {
+					return encode_locale_impl(str, locale, replacement, 2);
+				}
+			}
+		} else if (retry == 1) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				*progress = false;
+			} else {
+				*progress = true;
+			}
+			return std::string();
+		}
+		if (result == codecvt_type::error) {
+			++in_next;
+			*out_next = replacement;
+			++out_next;
+		}
+		in_begin = in_next;
+		out_begin = out_next;
+	} while ((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
+	return std::string(out.data(), out_next);
+}
+
+template <typename Tdststring>
+inline Tdststring encode_locale(const std::locale & locale, const mpt::widestring & src) {
+	if constexpr (std::is_same<Tdststring, std::string>::value) {
+		return encode_locale_impl(src, locale);
+	} else {
+		const std::string tmp = encode_locale_impl(src, locale);
+		return Tdststring(tmp.begin(), tmp.end());
+	}
+}
+
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+
+#if MPT_OS_WINDOWS
+template <typename Tdststring>
+inline Tdststring encode(UINT codepage, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_codepage<Tdststring>(codepage, src);
+}
+#endif // MPT_OS_WINDOWS
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <typename Tdststring>
+inline Tdststring encode(const std::locale & locale, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_locale<Tdststring>(src, locale);
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+template <typename Tdststring>
+inline Tdststring encode(const char32_t (&table)[256], const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_8bit<Tdststring>(src, table);
+}
+
+template <typename Tdststring>
+inline Tdststring encode(common_encoding encoding, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return encode_codepage<Tdststring>(codepage_from_encoding(encoding), src);
+	}
+#endif
+	switch (encoding) {
+		case common_encoding::utf8:
+			return encode_utf8<Tdststring>(src);
+			break;
+		case common_encoding::ascii:
+			return encode_ascii<Tdststring>(src);
+			break;
+		case common_encoding::iso8859_1:
+			return encode_iso8859_1<Tdststring>(src);
+			break;
+		case common_encoding::iso8859_15:
+			return encode_8bit<Tdststring>(src, CharsetTableISO8859_15);
+			break;
+		case common_encoding::cp437:
+			return encode_8bit<Tdststring>(src, CharsetTableCP437);
+			break;
+		case common_encoding::cp850:
+			return encode_8bit<Tdststring>(src, CharsetTableCP850);
+			break;
+		case common_encoding::windows1252:
+			return encode_8bit<Tdststring>(src, CharsetTableWindows1252);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+}
+
+template <typename Tdststring>
+inline Tdststring encode(logical_encoding encoding, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return encode_codepage<Tdststring>(codepage_from_encoding(encoding), src);
+	}
+#endif
+#if MPT_OS_DJGPP
+	switch (encoding) {
+		case logical_encoding::locale:
+			return encode<Tdststring>(djgpp_get_locale_encoding(), src);
+			break;
+		case logical_encoding::active_locale:
+			return encode<Tdststring>(djgpp_get_locale_encoding(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#elif !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+	switch (encoding) {
+		case logical_encoding::locale:
+			return encode_locale<Tdststring>(std::locale(""), src);
+			break;
+		case logical_encoding::active_locale:
+			return encode_locale<Tdststring>(std::locale(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#else
+	throw std::domain_error("unsupported encoding");
+#endif
+}
+
+#if MPT_OS_WINDOWS
+template <typename Tsrcstring>
+inline mpt::widestring decode(UINT codepage, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_codepage(codepage, src);
+}
+#endif // MPT_OS_WINDOWS
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <typename Tsrcstring>
+inline mpt::widestring decode(const std::locale & locale, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_locale(src, locale);
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(const char32_t (&table)[256], const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_8bit(src, table);
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(common_encoding encoding, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return decode_codepage(codepage_from_encoding(encoding), src);
+	}
+#endif
+	switch (encoding) {
+		case common_encoding::utf8:
+			return decode_utf8(src);
+			break;
+		case common_encoding::ascii:
+			return decode_ascii(src);
+			break;
+		case common_encoding::iso8859_1:
+			return decode_iso8859_1(src);
+			break;
+		case common_encoding::iso8859_15:
+			return decode_8bit(src, CharsetTableISO8859_15);
+			break;
+		case common_encoding::cp437:
+			return decode_8bit(src, CharsetTableCP437);
+			break;
+		case common_encoding::cp850:
+			return decode_8bit(src, CharsetTableCP850);
+			break;
+		case common_encoding::windows1252:
+			return decode_8bit(src, CharsetTableWindows1252);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(logical_encoding encoding, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return decode_codepage(codepage_from_encoding(encoding), src);
+	}
+#endif
+#if MPT_OS_DJGPP
+	switch (encoding) {
+		case logical_encoding::locale:
+			return decode(djgpp_get_locale_encoding(), src);
+			break;
+		case logical_encoding::active_locale:
+			return decode(djgpp_get_locale_encoding(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#elif !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+	switch (encoding) {
+		case logical_encoding::locale:
+			return decode_locale(std::locale(""), src);
+			break;
+		case logical_encoding::active_locale:
+			return decode_locale(std::locale(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#else
+	throw std::domain_error("unsupported encoding");
+#endif
+}
+
+
+
+inline bool is_utf8(const std::string & str) {
+	return (str == encode<std::string>(common_encoding::utf8, decode<std::string>(common_encoding::utf8, str)));
+}
+
+
+
+template <typename Tstring>
+struct string_converter {
+};
+
+template <logical_encoding encoding>
+struct string_converter<std::basic_string<char, logical_encoding_char_traits<encoding>>> {
+	using string_type = std::basic_string<char, logical_encoding_char_traits<encoding>>;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(encoding, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(encoding, src);
+	}
+};
+
+template <common_encoding encoding>
+struct string_converter<std::basic_string<char, common_encoding_char_traits<encoding>>> {
+	using string_type = std::basic_string<char, common_encoding_char_traits<encoding>>;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(encoding, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(encoding, src);
+	}
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct string_converter<std::wstring> {
+	using string_type = std::wstring;
+	static inline mpt::widestring decode(const string_type & src) {
+		return src;
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src;
+	}
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct string_converter<std::u8string> {
+	using string_type = std::u8string;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(common_encoding::utf8, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(common_encoding::utf8, src);
+	}
+};
+#endif // C++10
+
+template <>
+struct string_converter<std::u16string> {
+	using string_type = std::u16string;
+	static inline mpt::widestring decode(const string_type & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char16_t)) {
+			return mpt::widestring(src.begin(), src.end());
+		} else {
+			return utf32_from_utf16<mpt::widestring, std::u16string>(src);
+		}
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char16_t)) {
+			return string_type(src.begin(), src.end());
+		} else {
+			return utf16_from_utf32<std::u16string, mpt::widestring>(src);
+		}
+	}
+};
+
+#if defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct string_converter<std::u32string> {
+	using string_type = std::u32string;
+	static inline mpt::widestring decode(const string_type & src) {
+		return src;
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src;
+	}
+};
+#else  // !MPT_COMPILER_QUIRK_NO_WCHAR
+template <>
+struct string_converter<std::u32string> {
+	using string_type = std::u32string;
+	static inline mpt::widestring decode(const string_type & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char32_t)) {
+			return mpt::widestring(src.begin(), src.end());
+		} else {
+			return utf16_from_utf32<mpt::widestring, std::u32string>(src);
+		}
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char32_t)) {
+			return string_type(src.begin(), src.end());
+		} else {
+			return utf32_from_utf16<std::u32string, mpt::widestring>(src);
+		}
+	}
+};
+#endif // MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct string_converter<CStringW> {
+	using string_type = CStringW;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::widestring(src.GetString());
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src.c_str();
+	}
+};
+
+template <>
+struct string_converter<CStringA> {
+	using string_type = CStringA;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<std::string>(mpt::logical_encoding::locale, std::string(src.GetString()));
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<std::string>(mpt::logical_encoding::locale, src).c_str();
+	}
+};
+
+#endif // MPT_DETECTED_MFC
+
+template <typename Tdststring, typename Tsrcstring, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(const Tsrcstring & src) {
+	if constexpr (std::is_same<Tdststring, typename mpt::make_string_type<Tsrcstring>::type>::value) {
+		return mpt::as_string(src);
+	} else {
+		return string_converter<Tdststring>::encode(string_converter<decltype(mpt::as_string(src))>::decode(mpt::as_string(src)));
+	}
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tencoding, std::enable_if_t<std::is_same<Tdststring, std::string>::value, bool> = true, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tencoding to, const Tsrcstring & src) {
+	return mpt::encode<Tdststring>(to, string_converter<decltype(mpt::as_string(src))>::decode(mpt::as_string(src)));
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tencoding, std::enable_if_t<std::is_same<typename mpt::make_string_type<Tsrcstring>::type, std::string>::value, bool> = true, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tencoding from, const Tsrcstring & src) {
+	return string_converter<Tdststring>::encode(mpt::decode<decltype(mpt::as_string(src))>(from, mpt::as_string(src)));
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tto, typename Tfrom, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tto to, Tfrom from, const Tsrcstring & src) {
+	return mpt::encode<Tdststring>(to, mpt::decode<decltype(mpt::as_string(src))>(from, mpt::as_string(src)));
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_CONVERT_HPP

Property changes on: src/mpt/string/convert.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/convert_macros.hpp
===================================================================
--- src/mpt/string/convert_macros.hpp	(nonexistent)
+++ src/mpt/string/convert_macros.hpp	(working copy)
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_CONVERT_MACROS_HPP
+#define MPT_STRING_CONVERT_MACROS_HPP
+
+
+
+#include "mpt/string/types.hpp"
+#include "mpt/string/convert.hpp"
+
+#include <string>
+
+
+
+// The MPT_UTF8_STRING allows specifying UTF8 char arrays.
+// The resulting type is mpt::ustring and the construction might require runtime translation,
+// i.e. it is NOT generally available at compile time.
+// Use explicit UTF8 encoding,
+// i.e. U+00FC (LATIN SMALL LETTER U WITH DIAERESIS) would be written as "\xC3\xBC".
+#define MPT_UTF8_STRING(x) mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, std::string{x})
+
+
+
+#endif // MPT_STRING_CONVERT_MACROS_HPP

Property changes on: src/mpt/string/convert_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_floatingpoint.hpp
===================================================================
--- src/mpt/string/format_default_floatingpoint.hpp	(nonexistent)
+++ src/mpt/string/format_default_floatingpoint.hpp	(working copy)
@@ -0,0 +1,91 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP
+#define MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+
+#if MPT_MSVC_AT_LEAST(2019, 4) || MPT_GCC_AT_LEAST(11, 1, 0)
+#define MPT_FORMAT_CXX17_FLOAT 1
+#else
+#define MPT_FORMAT_CXX17_FLOAT 0
+#endif
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include "mpt/base/algorithm.hpp"
+#endif
+#include "mpt/string/convert.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include <charconv>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <iomanip>
+#include <ios>
+#include <limits>
+#include <locale>
+#include <sstream>
+#endif
+#include <string>
+#if MPT_FORMAT_CXX17_FLOAT
+#include <system_error>
+#endif
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_FORMAT_CXX17_FLOAT
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring to_chars_string(const T & x) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_chars_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+#endif
+
+
+#if !MPT_FORMAT_CXX17_FLOAT
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring to_stream_string(const T & x) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	s << std::setprecision(std::numeric_limits<T>::max_digits10) << x;
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_stream_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+#endif
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP

Property changes on: src/mpt/string/format_default_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_formatter.hpp
===================================================================
--- src/mpt/string/format_default_formatter.hpp	(nonexistent)
+++ src/mpt/string/format_default_formatter.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP
+#define MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_default_floatingpoint.hpp"
+#include "mpt/string/format_default_integer.hpp"
+#include "mpt/string/format_default_string.hpp"
+
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+struct default_formatter {
+	template <typename Tstring, typename T>
+	static inline Tstring format(const T & value) {
+		using namespace mpt;
+		return format_value_default<Tstring>(value);
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP

Property changes on: src/mpt/string/format_default_formatter.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_integer.hpp
===================================================================
--- src/mpt/string/format_default_integer.hpp	(nonexistent)
+++ src/mpt/string/format_default_integer.hpp	(working copy)
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP
+#define MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP
+
+
+#include "mpt/base/detect.hpp"
+
+#if 1
+#define MPT_FORMAT_CXX17_INT 1
+#else
+#define MPT_FORMAT_CXX17_INT 0
+#endif
+
+#if MPT_FORMAT_CXX17_INT
+#include "mpt/base/algorithm.hpp"
+#endif // MPT_FORMAT_CXX17_INT
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/format_helpers.hpp"
+
+#if MPT_FORMAT_CXX17_INT
+#include <charconv>
+#endif // MPT_FORMAT_CXX17_INT
+#if !MPT_FORMAT_CXX17_INT
+#include <ios>
+#include <locale>
+#include <sstream>
+#endif // !MPT_FORMAT_CXX17_INT
+#include <string>
+#if MPT_FORMAT_CXX17_INT
+#include <system_error>
+#endif // MPT_FORMAT_CXX17_INT
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_FORMAT_CXX17_INT
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring to_chars_string(const T & x) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		if constexpr (std::is_same<T, bool>::value) {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), static_cast<int>(x));
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		} else {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_chars_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+
+#endif // MPT_FORMAT_CXX17_INT
+
+
+#if !MPT_FORMAT_CXX17_INT
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring to_stream_string(const T & x) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	if constexpr (std::is_same<T, bool>::value) {
+		s << static_cast<int>(x);
+	} else if constexpr (mpt::is_character<T>::value) {
+		s << (x + 0); // force integral promotion
+	} else {
+		s << x;
+	}
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_stream_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+
+#endif // !MPT_FORMAT_CXX17_INT
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP

Property changes on: src/mpt/string/format_default_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_string.hpp
===================================================================
--- src/mpt/string/format_default_string.hpp	(nonexistent)
+++ src/mpt/string/format_default_string.hpp	(working copy)
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_STRING_HPP
+#define MPT_STRING_FORMAT_DEFAULT_STRING_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tstring, typename T>
+inline auto format_value_default(const T & x) -> decltype(mpt::convert<Tstring>(x)) {
+	return mpt::convert<Tstring>(x);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_STRING_HPP

Property changes on: src/mpt/string/format_default_string.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_helpers.hpp
===================================================================
--- src/mpt/string/format_helpers.hpp	(nonexistent)
+++ src/mpt/string/format_helpers.hpp	(working copy)
@@ -0,0 +1,106 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_HELPERS_HPP
+#define MPT_STRING_FORMAT_HELPERS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <string>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring convert_formatted_simple(const Tsrcstring & src) {
+	if constexpr (std::is_same<Tdststring, Tsrcstring>::value) {
+		return src;
+	} else {
+		Tdststring dst;
+		dst.reserve(src.length());
+		for (std::size_t i = 0; i < src.length(); ++i) {
+			dst.push_back(mpt::unsafe_char_convert<typename Tdststring::value_type>(src[i]));
+		}
+		return dst;
+	}
+}
+
+
+template <typename Tchar>
+struct select_format_char_type {
+	using type = char;
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct select_format_char_type<wchar_t> {
+	using type = wchar_t;
+};
+#if MPT_USTRING_MODE_WIDE
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct select_format_char_type<char8_t> {
+	using type = wchar_t;
+};
+#endif // C++20
+template <>
+struct select_format_char_type<char16_t> {
+	using type = wchar_t;
+};
+template <>
+struct select_format_char_type<char32_t> {
+	using type = wchar_t;
+};
+#endif // MPT_USTRING_MODE_WIDE
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+template <typename Tstring>
+struct select_format_string_type {
+	using type = mpt::ustring;
+};
+
+template <>
+struct select_format_string_type<std::string> {
+	using type = std::string;
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct select_format_string_type<std::wstring> {
+	using type = std::wstring;
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct select_format_string_type<std::u8string> {
+	using type = std::u8string;
+};
+#endif // C++20
+
+template <>
+struct select_format_string_type<std::u16string> {
+	using type = std::u16string;
+};
+
+template <>
+struct select_format_string_type<std::u32string> {
+	using type = std::u32string;
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_HELPERS_HPP

Property changes on: src/mpt/string/format_helpers.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_message.hpp
===================================================================
--- src/mpt/string/format_message.hpp	(nonexistent)
+++ src/mpt/string/format_message.hpp	(working copy)
@@ -0,0 +1,334 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_MESSAGE_HPP
+#define MPT_STRING_FORMAT_MESSAGE_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <utility>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class format_message_syntax_error
+	: public std::domain_error {
+public:
+	format_message_syntax_error()
+		: std::domain_error("format string syntax error") {
+		return;
+	}
+};
+
+template <typename Tformatter, typename Tformat>
+class message_formatter {
+
+public:
+	using Tstring = typename mpt::make_string_type<Tformat>::type;
+
+private:
+	Tstring format;
+
+private:
+	MPT_NOINLINE Tstring do_format(const mpt::span<const Tstring> vals) const {
+		using traits = typename mpt::string_traits<Tstring>;
+		using char_type = typename traits::char_type;
+		using size_type = typename traits::size_type;
+		Tstring result;
+		const size_type len = traits::length(format);
+		traits::reserve(result, len);
+		std::size_t max_arg = 0;
+		std::size_t args = 0;
+		bool success = true;
+		enum class state : int
+		{
+			error = -1,
+			text = 0,
+			open_seen = 1,
+			number_seen = 2,
+			close_seen = 3,
+		};
+		state state = state::text;
+		bool numbered_args = false;
+		bool unnumbered_args = false;
+		std::size_t last_arg = 0;
+		std::size_t this_arg = 0;
+		std::size_t current_arg = 0;
+		for (size_type pos = 0; pos != len; ++pos) {
+			char_type c = format[pos];
+			switch (state) {
+				case state::text:
+					if (c == char_type('{')) {
+						state = state::open_seen;
+					} else if (c == char_type('}')) {
+						state = state::close_seen;
+					} else {
+						state = state::text;
+						traits::append(result, 1, c); // output c here
+					}
+					break;
+				case state::open_seen:
+					if (c == char_type('{')) {
+						state = state::text;
+						traits::append(result, 1, char_type('{')); // output { here
+					} else if (c == char_type('}')) {
+						state = state::text;
+						unnumbered_args = true;
+						last_arg++;
+						this_arg = last_arg;
+						{ // output this_arg here
+							const std::size_t n = this_arg - 1;
+							if (n < std::size(vals)) {
+								traits::append(result, vals[n]);
+							}
+						}
+						if (this_arg > max_arg) {
+							max_arg = this_arg;
+						}
+						args += 1;
+					} else if (char_type('0') <= c && c <= char_type('9')) {
+						state = state::number_seen;
+						numbered_args = true;
+						current_arg = c - char_type('0');
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::number_seen:
+					if (c == char_type('{')) {
+						state = state::error;
+					} else if (c == char_type('}')) {
+						state = state::text;
+						this_arg = current_arg + 1;
+						{ // output this_arg here
+							const std::size_t n = this_arg - 1;
+							if (n < std::size(vals)) {
+								traits::append(result, vals[n]);
+							}
+						}
+						if (this_arg > max_arg) {
+							max_arg = this_arg;
+						}
+						args += 1;
+					} else if (char_type('0') <= c && c <= char_type('9')) {
+						state = state::number_seen;
+						numbered_args = true;
+						current_arg = (current_arg * 10) + (c - char_type('0'));
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::close_seen:
+					if (c == char_type('{')) {
+						state = state::error;
+					} else if (c == char_type('}')) {
+						state = state::text;
+						traits::append(result, 1, char_type('}')); // output } here
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::error:
+					state = state::error;
+					break;
+			}
+		}
+		if (state == state::error) {
+			success = false;
+		}
+		if (state != state::text) {
+			success = false;
+		}
+		if (numbered_args && unnumbered_args) {
+			success = false;
+		}
+		if (!success) {
+			throw format_message_syntax_error();
+		}
+		return result;
+	}
+
+public:
+	MPT_FORCEINLINE message_formatter(Tstring format_)
+		: format(std::move(format_)) {
+	}
+
+public:
+	template <typename... Ts>
+	MPT_NOINLINE Tstring operator()(Ts &&... xs) const {
+		const std::array<Tstring, sizeof...(xs)> vals{{Tformatter::template format<Tstring>(std::forward<Ts>(xs))...}};
+		return do_format(mpt::as_span(vals));
+	}
+
+}; // struct message_formatter<Tformat>
+
+
+template <typename Tformatter, std::ptrdiff_t N, typename Tchar, typename Tstring>
+class message_formatter_counted {
+
+private:
+	message_formatter<Tformatter, Tstring> formatter;
+
+public:
+	template <std::size_t literal_length>
+	inline message_formatter_counted(const Tchar (&format)[literal_length])
+		: formatter(Tstring(format)) {
+		return;
+	}
+
+public:
+	template <typename... Ts>
+	inline Tstring operator()(Ts &&... xs) const {
+		static_assert(static_cast<std::ptrdiff_t>(sizeof...(xs)) == N);
+		return formatter(std::forward<Ts>(xs)...);
+	}
+
+}; // struct message_formatter_counted<Tformat>
+
+
+template <typename Tchar>
+MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count_impl(const Tchar * const format, const std::size_t len) {
+	std::size_t max_arg = 0;
+	std::size_t args = 0;
+	bool success = true;
+	enum class state : int
+	{
+		error = -1,
+		text = 0,
+		open_seen = 1,
+		number_seen = 2,
+		close_seen = 3,
+	};
+	state state = state::text;
+	bool numbered_args = false;
+	bool unnumbered_args = false;
+	std::size_t last_arg = 0;
+	std::size_t this_arg = 0;
+	std::size_t current_arg = 0;
+	for (std::size_t pos = 0; pos != len; ++pos) {
+		Tchar c = format[pos];
+		switch (state) {
+			case state::text:
+				if (c == Tchar('{')) {
+					state = state::open_seen;
+				} else if (c == Tchar('}')) {
+					state = state::close_seen;
+				} else {
+					state = state::text;
+					// output c here
+				}
+				break;
+			case state::open_seen:
+				if (c == Tchar('{')) {
+					state = state::text;
+					// output { here
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					unnumbered_args = true;
+					last_arg++;
+					this_arg = last_arg;
+					// output this_arg here
+					if (this_arg > max_arg)
+					{
+						max_arg = this_arg;
+					}
+					args += 1;
+				} else if (Tchar('0') <= c && c <= Tchar('9')) {
+					state = state::number_seen;
+					numbered_args = true;
+					current_arg = c - Tchar('0');
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::number_seen:
+				if (c == Tchar('{')) {
+					state = state::error;
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					this_arg = current_arg + 1;
+					// output this_arg here
+					if (this_arg > max_arg) {
+						max_arg = this_arg;
+					}
+					args += 1;
+				} else if (Tchar('0') <= c && c <= Tchar('9')) {
+					state = state::number_seen;
+					numbered_args = true;
+					current_arg = (current_arg * 10) + (c - Tchar('0'));
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::close_seen:
+				if (c == Tchar('{')) {
+					state = state::error;
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					// output } here
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::error:
+				state = state::error;
+				break;
+		}
+	}
+	if (state == state::error) {
+		success = false;
+	}
+	if (state != state::text) {
+		success = false;
+	}
+	if (numbered_args && unnumbered_args) {
+		success = false;
+	}
+	if (!success) {
+		throw format_message_syntax_error();
+	}
+	if (max_arg != args) {
+		throw format_message_syntax_error();
+	}
+	return max_arg;
+}
+
+
+template <typename Tchar, std::size_t literal_length>
+MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count(const Tchar (&format)[literal_length]) {
+	return parse_format_string_argument_count_impl(format, literal_length - 1);
+}
+
+
+template <typename Tformatter, std::size_t args, typename Tchar, std::size_t N>
+inline auto format_message(const Tchar (&format)[N]) {
+	using Tstring = typename mpt::make_string_type<const Tchar *>::type;
+	return message_formatter_counted<Tformatter, args, Tchar, Tstring>(format);
+}
+
+template <typename Tformatter, std::size_t args, typename Tstring, typename Tchar, std::size_t N>
+inline auto format_message_typed(const Tchar (&format)[N]) {
+	return message_formatter_counted<Tformatter, args, Tchar, Tstring>(format);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_MESSAGE_HPP

Property changes on: src/mpt/string/format_message.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_message_macros.hpp
===================================================================
--- src/mpt/string/format_message_macros.hpp	(nonexistent)
+++ src/mpt/string/format_message_macros.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_MESSAGE_MACROS_HPP
+#define MPT_STRING_FORMAT_MESSAGE_MACROS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/format_default_formatter.hpp"
+#include "mpt/string/format_message.hpp"
+
+
+
+#define MPT_FORMAT_MESSAGE(f) mpt::format_message<mpt::default_formatter, mpt::parse_format_string_argument_count(f)>(f)
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#define MPT_WFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(L##f), std::wstring>(L##f)
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#define MPT_UFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(MPT_ULITERAL(f)), mpt::ustring>(MPT_ULITERAL(f))
+
+#define MPT_LFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(f), mpt::lstring>(f)
+
+#if MPT_OS_WINDOWS
+#define MPT_TFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(TEXT(f)), mpt::tstring>(TEXT(f))
+#endif
+
+#if MPT_DETECTED_MFC
+#define MPT_CWFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(L##f), CStringW>(L##f)
+#define MPT_CAFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(f), CStringA>(f)
+#define MPT_CFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(TEXT(f)), CString>(TEXT(f))
+#endif // MPT_DETECTED_MFC
+
+
+
+#endif // MPT_STRING_FORMAT_MESSAGE_MACROS_HPP

Property changes on: src/mpt/string/format_message_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple.hpp
===================================================================
--- src/mpt/string/format_simple.hpp	(nonexistent)
+++ src/mpt/string/format_simple.hpp	(working copy)
@@ -0,0 +1,166 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_HPP
+#define MPT_STRING_FORMAT_SIMPLE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/pointer.hpp"
+#include "mpt/string/format_default_formatter.hpp"
+#include "mpt/string/format_simple_floatingpoint.hpp"
+#include "mpt/string/format_simple_integer.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename Tstring>
+struct format : format_simple_base {
+
+	template <typename T>
+	static inline Tstring val(const T & x) {
+		return mpt::default_formatter::format<Tstring>(x);
+	}
+
+	template <typename T>
+	static inline Tstring fmt(const T & x, const format_simple_spec & f) {
+		return mpt::format_simple<Tstring>(x, f);
+	}
+
+	template <typename T>
+	static inline Tstring dec(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillOff());
+	}
+	template <int width, typename T>
+	static inline Tstring dec0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillNul().Width(width));
+	}
+
+	template <typename T>
+	static inline Tstring dec(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillOff().Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring dec0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+
+	template <typename T>
+	static inline Tstring hex(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillOff());
+	}
+	template <typename T>
+	static inline Tstring HEX(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillOff());
+	}
+	template <int width, typename T>
+	static inline Tstring hex0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillNul().Width(width));
+	}
+	template <int width, typename T>
+	static inline Tstring HEX0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillNul().Width(width));
+	}
+
+	template <typename T>
+	static inline Tstring hex(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillOff().Group(g).GroupSep(s));
+	}
+	template <typename T>
+	static inline Tstring HEX(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillOff().Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring hex0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring HEX0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+
+	template <typename T>
+	static inline Tstring flt(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaNrm().FillOff().Precision(precision));
+	}
+	template <typename T>
+	static inline Tstring fix(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaFix().FillOff().Precision(precision));
+	}
+	template <typename T>
+	static inline Tstring sci(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaSci().FillOff().Precision(precision));
+	}
+
+	template <typename T>
+	static inline Tstring ptr(const T & x) {
+		static_assert(std::is_pointer<T>::value || std::is_same<T, std::uintptr_t>::value || std::is_same<T, std::intptr_t>::value, "");
+		return hex0<mpt::pointer_size * 2>(mpt::pointer_cast<const std::uintptr_t>(x));
+	}
+	template <typename T>
+	static inline Tstring PTR(const T & x) {
+		static_assert(std::is_pointer<T>::value || std::is_same<T, std::uintptr_t>::value || std::is_same<T, std::intptr_t>::value, "");
+		return HEX0<mpt::pointer_size * 2>(mpt::pointer_cast<const std::uintptr_t>(x));
+	}
+
+	static inline Tstring pad_left(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return traits::pad(str, width, 0);
+	}
+	static inline Tstring pad_right(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return traits::pad(str, 0, width);
+	}
+	static inline Tstring left(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, 0, width - traits::length(str)) : str;
+	}
+	static inline Tstring right(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, width - traits::length(str), 0) : str;
+	}
+	static inline Tstring center(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, (width - traits::length(str)) / 2, (width - traits::length(str) + 1) / 2) : str;
+	}
+
+}; // struct format
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_HPP

Property changes on: src/mpt/string/format_simple.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_floatingpoint.hpp
===================================================================
--- src/mpt/string/format_simple_floatingpoint.hpp	(nonexistent)
+++ src/mpt/string/format_simple_floatingpoint.hpp	(working copy)
@@ -0,0 +1,242 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP
+#define MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/string/format_default_floatingpoint.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include "mpt/base/algorithm.hpp"
+#endif
+#include "mpt/string/convert.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include <charconv>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <iomanip>
+#include <ios>
+#endif
+#if MPT_FORMAT_CXX17_FLOAT
+#include <iterator>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <limits>
+#include <locale>
+#include <sstream>
+#endif
+#include <string>
+#if MPT_FORMAT_CXX17_FLOAT
+#include <system_error>
+#endif
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_FORMAT_CXX17_FLOAT
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_to_chars(const T & x, std::chars_format fmt) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, fmt);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_to_chars(const T & x, std::chars_format fmt, int precision) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, fmt, precision);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring>
+inline Tstring format_simple_floatingpoint_postprocess_width(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	if (f & format_simple_base::FillNul) {
+		auto pos = str.begin();
+		if (str.length() > 0) {
+			if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+')) {
+				pos++;
+				width++;
+			} else if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')) {
+				pos++;
+				width++;
+			}
+		}
+		if (str.length() - std::distance(str.begin(), pos) < width) {
+			str.insert(pos, width - str.length() - std::distance(str.begin(), pos), '0');
+		}
+	} else {
+		if (str.length() < width) {
+			str.insert(0, width - str.length(), ' ');
+		}
+	}
+	return str;
+}
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & f) {
+	using format_string_type = typename mpt::select_format_string_type<Tstring>::type;
+	if (f.GetPrecision() != -1) {
+		if (f.GetFlags() & format_simple_base::NotaSci) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::scientific, f.GetPrecision()), f));
+		} else if (f.GetFlags() & format_simple_base::NotaFix) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::fixed, f.GetPrecision()), f));
+		} else {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::general, f.GetPrecision()), f));
+		}
+	} else {
+		if (f.GetFlags() & format_simple_base::NotaSci) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::scientific), f));
+		} else if (f.GetFlags() & format_simple_base::NotaFix) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::fixed), f));
+		} else {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::general), f));
+		}
+	}
+}
+
+
+#else // !MPT_FORMAT_CXX17_FLOAT
+
+
+template <typename Tchar>
+struct NumPunct : std::numpunct<Tchar> {
+private:
+	unsigned int group;
+	char sep;
+
+public:
+	NumPunct(unsigned int g, char s)
+		: group(g)
+		, sep(s) { }
+	std::string do_grouping() const override {
+		return std::string(1, static_cast<char>(group));
+	}
+	Tchar do_thousands_sep() const override {
+		return static_cast<Tchar>(sep);
+	}
+};
+
+template <typename Tostream, typename T>
+inline void format_simple_floatingpoint_apply_stream_format(Tostream & o, const format_simple_spec & format, const T &) {
+	if (format.GetGroup() > 0)
+	{
+		o.imbue(std::locale(o.getloc(), new NumPunct<typename Tostream::char_type>(format.GetGroup(), format.GetGroupSep())));
+	}
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	int precision = format.GetPrecision();
+	if (precision != -1 && width != 0 && !(f & format_simple_base::NotaFix) && !(f & format_simple_base::NotaSci))
+	{
+		// fixup:
+		// precision behaves differently from .#
+		// avoid default format when precision and width are set
+		f &= ~format_simple_base::NotaNrm;
+		f |= format_simple_base::NotaFix;
+	}
+	if (f & format_simple_base::BaseDec) {
+		o << std::dec;
+	} else if (f & format_simple_base::BaseHex) {
+		o << std::hex;
+	}
+	if (f & format_simple_base::NotaNrm) { /*nothing*/
+	} else if (f & format_simple_base::NotaFix) {
+		o << std::setiosflags(std::ios::fixed);
+	} else if (f & format_simple_base::NotaSci) {
+		o << std::setiosflags(std::ios::scientific);
+	}
+	if (f & format_simple_base::CaseLow) {
+		o << std::nouppercase;
+	} else if (f & format_simple_base::CaseUpp) {
+		o << std::uppercase;
+	}
+	if (f & format_simple_base::FillOff) { /* nothing */
+	} else if (f & format_simple_base::FillNul) {
+		o << std::setw(width) << std::setfill(typename Tostream::char_type('0'));
+	}
+	if (precision != -1)
+	{
+		o << std::setprecision(precision);
+	} else
+	{
+		if constexpr (std::is_floating_point<T>::value)
+		{
+			if (f & format_simple_base::NotaNrm)
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10);
+			} else if (f & format_simple_base::NotaFix)
+			{
+				o << std::setprecision(std::numeric_limits<T>::digits10);
+			} else if (f & format_simple_base::NotaSci)
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10 - 1);
+			} else
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10);
+			}
+		}
+	}
+}
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_stream(const T & x, const format_simple_spec & f) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	mpt::format_simple_floatingpoint_apply_stream_format(s, f, x);
+	s << x;
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & format) {
+	return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_stream<typename mpt::select_format_string_type<Tstring>::type>(x, format));
+}
+
+
+
+#endif // MPT_FORMAT_CXX17_FLOAT
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP

Property changes on: src/mpt/string/format_simple_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_integer.hpp
===================================================================
--- src/mpt/string/format_simple_integer.hpp	(nonexistent)
+++ src/mpt/string/format_simple_integer.hpp	(working copy)
@@ -0,0 +1,134 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP
+#define MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP
+
+
+#include "mpt/base/algorithm.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+
+#include <charconv>
+#include <string>
+#include <system_error>
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_simple_integer_to_chars(const T & x, int base) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		if constexpr (std::is_same<T, bool>::value) {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), static_cast<int>(x), base);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		} else {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, base);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_case(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	if (f & format_simple_base::CaseUpp) {
+		for (auto & c : str) {
+			if (mpt::unsafe_char_convert<typename Tstring::value_type>('a') <= c && c <= mpt::unsafe_char_convert<typename Tstring::value_type>('z')) {
+				c -= mpt::unsafe_char_convert<typename Tstring::value_type>('a') - mpt::unsafe_char_convert<typename Tstring::value_type>('A');
+			}
+		}
+	}
+	return str;
+}
+
+
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_digits(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	if (f & format_simple_base::FillNul) {
+		auto pos = str.begin();
+		if (str.length() > 0) {
+			if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+')) {
+				pos++;
+				width++;
+			} else if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')) {
+				pos++;
+				width++;
+			}
+		}
+		if (str.length() < width) {
+			str.insert(pos, width - str.length(), mpt::unsafe_char_convert<typename Tstring::value_type>('0'));
+		}
+	}
+	return str;
+}
+
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4723) // potential divide by 0
+#endif                          // MPT_COMPILER_MSVC
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_group(Tstring str, const format_simple_spec & format) {
+	if (format.GetGroup() > 0) {
+		const unsigned int groupSize = format.GetGroup();
+		const char groupSep = format.GetGroupSep();
+		std::size_t len = str.length();
+		for (std::size_t n = 0; n < len; ++n) {
+			if (n > 0 && (n % groupSize) == 0) {
+				if (!(n == (len - 1) && (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+') || str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')))) {
+					str.insert(str.begin() + (len - n), 1, mpt::unsafe_char_convert<typename Tstring::value_type>(groupSep));
+				}
+			}
+		}
+	}
+	return str;
+}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & format) {
+	int base = 10;
+	if (format.GetFlags() & format_simple_base::BaseDec) {
+		base = 10;
+	}
+	if (format.GetFlags() & format_simple_base::BaseHex) {
+		base = 16;
+	}
+	using format_string_type = typename mpt::select_format_string_type<Tstring>::type;
+	return mpt::convert<Tstring>(mpt::format_simple_integer_postprocess_group(mpt::format_simple_integer_postprocess_digits(mpt::format_simple_integer_postprocess_case(mpt::format_simple_integer_to_chars<format_string_type>(x, base), format), format), format));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP

Property changes on: src/mpt/string/format_simple_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_spec.hpp
===================================================================
--- src/mpt/string/format_simple_spec.hpp	(nonexistent)
+++ src/mpt/string/format_simple_spec.hpp	(working copy)
@@ -0,0 +1,218 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_SPEC_HPP
+#define MPT_STRING_FORMAT_SIMPLE_SPEC_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+struct format_simple_base {
+
+	enum FormatFlagsEnum
+	{
+		BaseDec = 0x0001, // base 10 (integers only)        // int+float
+		BaseHex = 0x0002, // base 16 (integers only)        // int+float
+		CaseLow = 0x0010, // lower case hex digits          // int+float
+		CaseUpp = 0x0020, // upper case hex digits          // int+float
+		FillOff = 0x0100, // do not fill up width           // int+float
+		FillNul = 0x0400, // fill up width with zeros       // int+float
+		NotaNrm = 0x1000, // float: normal/default notation // float
+		NotaFix = 0x2000, // float: fixed point notation    // float
+		NotaSci = 0x4000, // float: scientific notation     // float
+	};
+
+}; // struct format_simple_base
+
+using format_simple_flags = unsigned int;
+
+static_assert(sizeof(format_simple_flags) >= sizeof(format_simple_base::FormatFlagsEnum));
+
+
+class format_simple_spec {
+private:
+	format_simple_flags flags;
+	std::size_t width;  // int+float
+	int precision;      // float
+	unsigned int group; // int
+	char group_sep;     // int
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec() noexcept
+		: flags(0), width(0), precision(-1), group(0), group_sep(',') { }
+	MPT_CONSTEXPRINLINE format_simple_flags GetFlags() const noexcept {
+		return flags;
+	}
+	MPT_CONSTEXPRINLINE std::size_t GetWidth() const noexcept {
+		return width;
+	}
+	MPT_CONSTEXPRINLINE int GetPrecision() const noexcept {
+		return precision;
+	}
+	MPT_CONSTEXPRINLINE unsigned int GetGroup() const noexcept {
+		return group;
+	}
+	MPT_CONSTEXPRINLINE char GetGroupSep() const noexcept {
+		return group_sep;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetFlags(format_simple_flags f) noexcept {
+		flags = f;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetWidth(std::size_t w) noexcept {
+		width = w;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetPrecision(int p) noexcept {
+		precision = p;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetGroup(unsigned int g) noexcept {
+		group = g;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetGroupSep(char s) noexcept {
+		group_sep = s;
+		return *this;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & BaseDec() noexcept {
+		flags &= ~(format_simple_base::BaseDec | format_simple_base::BaseHex);
+		flags |= format_simple_base::BaseDec;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & BaseHex() noexcept {
+		flags &= ~(format_simple_base::BaseDec | format_simple_base::BaseHex);
+		flags |= format_simple_base::BaseHex;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & CaseLow() noexcept {
+		flags &= ~(format_simple_base::CaseLow | format_simple_base::CaseUpp);
+		flags |= format_simple_base::CaseLow;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & CaseUpp() noexcept {
+		flags &= ~(format_simple_base::CaseLow | format_simple_base::CaseUpp);
+		flags |= format_simple_base::CaseUpp;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillOff() noexcept {
+		flags &= ~(format_simple_base::FillOff | format_simple_base::FillNul);
+		flags |= format_simple_base::FillOff;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillNul() noexcept {
+		flags &= ~(format_simple_base::FillOff | format_simple_base::FillNul);
+		flags |= format_simple_base::FillNul;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaNrm() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaNrm;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaFix() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaFix;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaSci() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaSci;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Width(std::size_t w) noexcept {
+		width = w;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Prec(int p) noexcept {
+		precision = p;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Group(unsigned int g) noexcept {
+		group = g;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & GroupSep(char s) noexcept {
+		group_sep = s;
+		return *this;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & Dec() noexcept {
+		return BaseDec();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Hex() noexcept {
+		return BaseHex();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Low() noexcept {
+		return CaseLow();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Upp() noexcept {
+		return CaseUpp();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Off() noexcept {
+		return FillOff();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Nul() noexcept {
+		return FillNul();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Nrm() noexcept {
+		return NotaNrm();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Fix() noexcept {
+		return NotaFix();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Sci() noexcept {
+		return NotaSci();
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & Decimal() noexcept {
+		return BaseDec();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Hexadecimal() noexcept {
+		return BaseHex();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Lower() noexcept {
+		return CaseLow();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Upper() noexcept {
+		return CaseUpp();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillNone() noexcept {
+		return FillOff();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillZero() noexcept {
+		return FillNul();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatNormal() noexcept {
+		return NotaNrm();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatFixed() noexcept {
+		return NotaFix();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatScientific() noexcept {
+		return NotaSci();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Precision(int p) noexcept {
+		return Prec(p);
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_SPEC_HPP

Property changes on: src/mpt/string/format_simple_spec.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/parse.hpp
===================================================================
--- src/mpt/string/parse.hpp	(nonexistent)
+++ src/mpt/string/parse.hpp	(working copy)
@@ -0,0 +1,107 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_PARSE_HPP
+#define MPT_STRING_PARSE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <ios>
+#include <locale>
+#include <sstream>
+#include <string>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline std::string parse_as_internal_string_type(const std::string & s) {
+	return s;
+}
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+inline std::wstring parse_as_internal_string_type(const std::wstring & s) {
+	return s;
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_USTRING_MODE_WIDE
+template <typename Tstring>
+inline std::wstring parse_as_internal_string_type(const Tstring & s) {
+	return mpt::convert<std::wstring>(s);
+}
+#else  // !MPT_USTRING_MODE_WIDE
+template <typename Tstring>
+inline std::string parse_as_internal_string_type(const Tstring & s) {
+	return mpt::convert<std::string>(mpt::common_encoding::utf8, s);
+}
+#endif // MPT_USTRING_MODE_WIDE
+
+
+template <typename T, typename Tstring>
+inline T ConvertStringTo(const Tstring & str) {
+	std::basic_istringstream<typename decltype(mpt::parse_as_internal_string_type(mpt::as_string(str)))::value_type> stream(mpt::parse_as_internal_string_type(mpt::as_string(str)));
+	stream.imbue(std::locale::classic());
+	T value;
+	if constexpr (std::is_same<T, signed char>::value) {
+		signed int tmp;
+		if (!(stream >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else if constexpr (std::is_same<T, unsigned char>::value) {
+		unsigned int tmp;
+		if (!(stream >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else {
+		if (!(stream >> value)) {
+			return T{};
+		}
+	}
+	return value;
+}
+
+
+template <typename T, typename Tstring>
+inline T ConvertHexStringTo(const Tstring & str) {
+	std::basic_istringstream<typename decltype(mpt::parse_as_internal_string_type(mpt::as_string(str)))::value_type> stream(mpt::parse_as_internal_string_type(mpt::as_string(str)));
+	stream.imbue(std::locale::classic());
+	T value;
+	if constexpr (std::is_same<T, signed char>::value) {
+		signed int tmp;
+		if (!(stream >> std::hex >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else if constexpr (std::is_same<T, unsigned char>::value) {
+		unsigned int tmp;
+		if (!(stream >> std::hex >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else {
+		if (!(stream >> std::hex >> value)) {
+			return T{};
+		}
+	}
+	return value;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_PARSE_HPP

Property changes on: src/mpt/string/parse.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_buffer.hpp
===================================================================
--- src/mpt/string/tests/tests_string_buffer.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_buffer.hpp	(working copy)
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_BUFFER_HPP
+#define MPT_STRING_TESTS_STRING_BUFFER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/buffer.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_buffer{
+	"mpt/string/buffer",
+	[](mpt::test::context & context) {
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteAutoBuf(buf) = std::string("foobar");
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			char foobar[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'};
+			mpt::WriteTypedBuf<std::string>(buf) = (char *)foobar;
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteTypedBuf<std::string>(buf) = (const char *)"foobar";
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteTypedBuf<std::string>(buf) = "foobar";
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			const char buf[4] = {'f', 'o', 'o', 'b'};
+			std::string foo = mpt::ReadAutoBuf(buf);
+			MPT_TEST_EXPECT_EQUAL(foo, std::string("foob"));
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_BUFFER_HPP

Property changes on: src/mpt/string/tests/tests_string_buffer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_convert.hpp
===================================================================
--- src/mpt/string/tests/tests_string_convert.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_convert.hpp	(working copy)
@@ -0,0 +1,222 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_CONVERT_HPP
+#define MPT_STRING_TESTS_STRING_CONVERT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/convert_macros.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_convert{
+	"mpt/string/convert",
+	[](mpt::test::context & context) {
+		// MPT_UTF8_STRING version
+
+		// Charset conversions (basic sanity checks)
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "a"), MPT_USTRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "a"), MPT_USTRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "a"), MPT_USTRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "a"), MPT_USTRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "a"), MPT_UTF8_STRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "a"), MPT_UTF8_STRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "a"), MPT_UTF8_STRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "a"), MPT_UTF8_STRING("a"));
+
+#if MPT_OS_EMSCRIPTEN
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("\xe2\x8c\x82")), "\xe2\x8c\x82");
+#endif // MPT_OS_EMSCRIPTEN
+
+		// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
+		// We test german umlaut-a (U+00E4) (\xC3\xA4) and CJK U+5BB6 (\xE5\xAE\xB6)
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+
+		// Check that characters are correctly converted
+		// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+		// cp437
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\x84xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\x84xyz"));
+
+		// iso8859
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\xE4xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE4xyz"));
+
+		// utf8
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\xC3\xA4xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc\xE5\xAE\xB6xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"));
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+
+		// wide L"" version
+
+		// Charset conversions (basic sanity checks)
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "a"), L"a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "a"), L"a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "a"), L"a");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "a"), L"a");
+
+	// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
+	// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4428) // universal-character-name encountered in source
+#endif
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u00E4xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u5BB6xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), L"abc"));
+
+		// Check that characters are correctly converted
+		// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+		// cp437
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "abc\x84xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\x84xyz"));
+
+		// iso8859
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "abc\xE4xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE4xyz"));
+
+		// utf8
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "abc\xC3\xA4xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "abc\xE5\xAE\xB6xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u5BB6xyz", mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"));
+
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif
+
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_CONVERT_HPP

Property changes on: src/mpt/string/tests/tests_string_convert.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_format_message.hpp
===================================================================
--- src/mpt/string/tests/tests_string_format_message.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_format_message.hpp	(working copy)
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP
+#define MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_message.hpp"
+#include "mpt/string/format_message_macros.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_format_message{
+	"mpt/string/format_message",
+	[](mpt::test::context & context) {
+		static_assert(mpt::parse_format_string_argument_count("") == 0);
+		static_assert(mpt::parse_format_string_argument_count("{{") == 0);
+		static_assert(mpt::parse_format_string_argument_count("}}") == 0);
+		static_assert(mpt::parse_format_string_argument_count("{}") == 1);
+		static_assert(mpt::parse_format_string_argument_count("{}{}") == 2);
+		static_assert(mpt::parse_format_string_argument_count("{0}{1}") == 2);
+
+		// basic
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}{}{}")(1, 2, 3), "123");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{2}{1}{0}")(1, 2, 3), "321");
+
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{2}{1}{0}{4}{3}{6}{5}{7}{10}{9}{8}")(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a"), "21043657a98");
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE(L"{}{}{}")(1, 2, 3), L"123");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+		// escaping behviour
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%")(), "%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%")(), "%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%%")(), "%%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}")("a"), "a");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%")("a"), "a%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%")("a"), "a%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%%")("a"), "a%%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%1")(), "%1");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%{}")("a"), "%a");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%b")(), "%b");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{{}}")(), "{}");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{{{}}}")("a"), "{a}");
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP

Property changes on: src/mpt/string/tests/tests_string_format_message.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_format_simple.hpp
===================================================================
--- src/mpt/string/tests/tests_string_format_simple.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_format_simple.hpp	(working copy)
@@ -0,0 +1,154 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP
+#define MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_format_simple{
+	"mpt/string/format_simple",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(1.5f), "1.5");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(true), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(false), "0");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(0), "0");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(-23), "-23");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(42), "42");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<3>((int32)-1), "-001");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex((int32)-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(-0xabcde), "-abcde");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(std::numeric_limits<int32>::min()), "-80000000");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(std::numeric_limits<int32>::min() + 1), "-7fffffff");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(0x123e), "123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<6>(0x123e), "00123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<2>(0x123e), "123e");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(1), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(1), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(1), "01");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(1), "001");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(11), "011");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(-1), "-01");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(-1), "-001");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(0xa2345678), MPT_USTRING("A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(0xa2345678), MPT_USTRING("A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(0xa2345678), MPT_USTRING("0A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(0xa2345678), MPT_USTRING("00A2345678"));
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex(0x123e), L"123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex0<6>(0x123e), L"00123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex0<2>(0x123e), L"123e");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(-87.0f), "-87");
+		if (mpt::format<std::string>::val(-0.5e-6) != "-5e-007"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-5e-07"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-5e-7"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-7"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-07"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-007")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-005"
+			&& mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-05"
+			&& mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-5")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-005"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-05"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-5"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-005"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-05"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-5")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(58.65403492763) != "58.654034927630001"
+			&& mpt::format<std::string>::val(58.65403492763) != "58.65403492763")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(58.65403492763, 6), "58.654");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(23.42, 1), "23.4");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(234.2, 1), "234.2");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(2342.0, 1), "2342.0");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec(2, ';', 2345678), std::string("2;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec(2, ';', 12345678), std::string("12;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(3, ':', 0xa2345678), std::string("a2:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::dec(2, ';', 12345678), MPT_USTRING("12;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::hex(3, ':', 0xa2345678), MPT_USTRING("a2:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', 0xa2345678), MPT_USTRING("A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(3, ':', 0xa2345678), MPT_USTRING("A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(3, ':', 0xa2345678), MPT_USTRING("0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(3, ':', 0xa2345678), MPT_USTRING("0:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<11>(3, ':', 0xa2345678), MPT_USTRING("00:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<12>(3, ':', 0xa2345678), MPT_USTRING("000:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', -0x12345678), MPT_USTRING("-12:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(3, ':', -0x12345678), MPT_USTRING("-12:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(3, ':', -0x12345678), MPT_USTRING("-012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(3, ':', -0x12345678), MPT_USTRING("-0:012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<11>(3, ':', -0x12345678), MPT_USTRING("-00:012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<12>(3, ':', -0x12345678), MPT_USTRING("-000:012:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<5>(3, ':', 0x345678), MPT_USTRING("345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<6>(3, ':', 0x345678), MPT_USTRING("345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', 0x345678), MPT_USTRING("0:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<5>(3, ':', -0x345678), MPT_USTRING("-345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<6>(3, ':', -0x345678), MPT_USTRING("-345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', -0x345678), MPT_USTRING("-0:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::left(3, "a"), "a  ");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::right(3, "a"), "  a");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::center(3, "a"), " a ");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::center(4, "a"), " a  ");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(6.12345, 3), "6.12");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(6.12345, 3), "6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(6.12345, 4), "6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(6.12345, 4), "6.1235");
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::flt(6.12345, 3), L"6.12");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::fix(6.12345, 3), L"6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::flt(6.12345, 4), L"6.123");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP

Property changes on: src/mpt/string/tests/tests_string_format_simple.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_parse.hpp
===================================================================
--- src/mpt/string/tests/tests_string_parse.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_parse.hpp	(working copy)
@@ -0,0 +1,70 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_PARSE_HPP
+#define MPT_STRING_TESTS_STRING_PARSE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/parse.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_parse{
+	"mpt/string/parse",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("586"), 586u);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("2147483647"), (uint32)std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("4294967295"), std::numeric_limits<uint32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("-9223372036854775808"), std::numeric_limits<int64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("-159"), -159);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("9223372036854775807"), std::numeric_limits<int64>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("85059"), 85059u);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("9223372036854775807"), (uint64)std::numeric_limits<int64>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("18446744073709551615"), std::numeric_limits<uint64>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<float>("-87.0"), -87.0f);
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>("-0.5e-6"), -0.5e-6);
+#endif
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>("58.65403492763"), 58.65403492763);
+#else
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStrTo<double>("58.65403492763"), 58.65403492763, 0.0001);
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<float>(mpt::format<std::string>::val(-87.0)), -87.0f);
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>(mpt::format<std::string>::val(-0.5e-6)), -0.5e-6);
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned char>("fe"), 254);
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned char>(L"fe"), 254);
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned int>(MPT_USTRING("ffff")), 65535u);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_PARSE_HPP

Property changes on: src/mpt/string/tests/tests_string_parse.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_utility.hpp
===================================================================
--- src/mpt/string/tests/tests_string_utility.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_utility.hpp	(working copy)
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_UTILITY_HPP
+#define MPT_STRING_TESTS_STRING_UTILITY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/utility.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_utility{
+	"mpt/string/utility",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_left(std::string(" ")), "");
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_right(std::string(" ")), "");
+		MPT_TEST_EXPECT_EQUAL(mpt::trim(std::string(" ")), "");
+
+		// weird things with std::string containing \0 in the middle and trimming \0
+		MPT_TEST_EXPECT_EQUAL(std::string("\0\ta\0b ", 6).length(), (std::size_t)6);
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_right(std::string("\0\ta\0b ", 6)), std::string("\0\ta\0b", 5));
+		MPT_TEST_EXPECT_EQUAL(mpt::trim(std::string("\0\ta\0b\0", 6), std::string("\0", 1)), std::string("\ta\0b", 4));
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_UTILITY_HPP

Property changes on: src/mpt/string/tests/tests_string_utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/types.hpp
===================================================================
--- src/mpt/string/types.hpp	(nonexistent)
+++ src/mpt/string/types.hpp	(working copy)
@@ -0,0 +1,406 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TYPES_HPP
+#define MPT_STRING_TYPES_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <string>
+#include <type_traits>
+
+#include <cstddef>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+enum class common_encoding
+{
+	utf8,
+	ascii, // strictly 7-bit ASCII
+	iso8859_1,
+	iso8859_15,
+	cp850,
+	cp437,
+	windows1252,
+};
+
+
+enum class logical_encoding
+{
+	locale,        // CP_ACP on windows, system configured C locale otherwise
+	active_locale, // active C/C++ global locale
+};
+
+// source code / preprocessor (i.e. # token)
+inline constexpr auto source_encoding = common_encoding::ascii;
+
+// debug log files
+inline constexpr auto logfile_encoding = common_encoding::utf8;
+
+// std::clog / std::cout / std::cerr
+inline constexpr auto stdio_encoding = logical_encoding::locale;
+
+// getenv
+inline constexpr auto environment_encoding = logical_encoding::locale;
+
+// std::exception::what()
+inline constexpr auto exception_encoding = logical_encoding::active_locale;
+
+
+
+
+
+template <typename T>
+struct is_character : public std::false_type { };
+
+template <>
+struct is_character<char> : public std::true_type { };
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct is_character<wchar_t> : public std::true_type { };
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct is_character<char8_t> : public std::true_type { };
+#endif // C++20
+template <>
+struct is_character<char16_t> : public std::true_type { };
+template <>
+struct is_character<char32_t> : public std::true_type { };
+
+
+
+
+
+template <typename T>
+MPT_CONSTEXPRINLINE unsigned char char_value(T x) noexcept = delete;
+
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<char>(char x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<unsigned char>(unsigned char x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<char8_t>(char8_t x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+#endif // C++20
+
+
+
+
+
+template <typename T>
+struct unsafe_char_converter { };
+
+template <>
+struct unsafe_char_converter<char> {
+	static constexpr char32_t decode(char c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char encode(char32_t c) noexcept {
+		return static_cast<char>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct unsafe_char_converter<wchar_t> {
+	static constexpr char32_t decode(wchar_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr wchar_t encode(char32_t c) noexcept {
+		return static_cast<wchar_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct unsafe_char_converter<char8_t> {
+	static constexpr char32_t decode(char8_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char8_t encode(char32_t c) noexcept {
+		return static_cast<char8_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+#endif // C++20
+
+template <>
+struct unsafe_char_converter<char16_t> {
+	static constexpr char32_t decode(char16_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char16_t encode(char32_t c) noexcept {
+		return static_cast<char16_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+template <>
+struct unsafe_char_converter<char32_t> {
+	static constexpr char32_t decode(char32_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char32_t encode(char32_t c) noexcept {
+		return static_cast<char32_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+template <typename Tdstchar, typename Tsrcchar>
+constexpr Tdstchar unsafe_char_convert(Tsrcchar src) noexcept {
+	return mpt::unsafe_char_converter<Tdstchar>::encode(mpt::unsafe_char_converter<Tsrcchar>::decode(src));
+}
+
+
+
+
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+using widestring = std::wstring;
+using widechar = wchar_t;
+#define MPT_WIDECHAR(x)    L##x
+#define MPT_WIDELITERAL(x) L##x
+#define MPT_WIDESTRING(x)  std::wstring(L##x)
+#else // MPT_COMPILER_QUIRK_NO_WCHAR
+using widestring = std::u32string;
+using widechar = char32_t;
+#define MPT_WIDECHAR(x)    U##x
+#define MPT_WIDELITERAL(x) U##x
+#define MPT_WIDESTRING(x)  std::u32string(U##x)
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+
+template <common_encoding common_encoding_tag>
+struct common_encoding_char_traits : std::char_traits<char> {
+	static constexpr auto encoding() noexcept {
+		return common_encoding_tag;
+	}
+};
+
+template <logical_encoding logical_encoding_tag>
+struct logical_encoding_char_traits : std::char_traits<char> {
+	static constexpr auto encoding() noexcept {
+		return logical_encoding_tag;
+	}
+};
+
+
+
+using lstring = std::basic_string<char, mpt::logical_encoding_char_traits<logical_encoding::locale>>;
+
+using source_string = std::basic_string<char, mpt::common_encoding_char_traits<source_encoding>>;
+using exception_string = std::basic_string<char, mpt::logical_encoding_char_traits<exception_encoding>>;
+
+#if MPT_OS_WINDOWS
+
+template <typename Tchar>
+struct windows_char_traits { };
+template <>
+struct windows_char_traits<CHAR> { using string_type = mpt::lstring; };
+template <>
+struct windows_char_traits<WCHAR> { using string_type = std::wstring; };
+
+using tstring = windows_char_traits<TCHAR>::string_type;
+
+using winstring = mpt::tstring;
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using u8string = std::u8string;
+using u8char = char8_t;
+#define MPT_U8CHAR(x)    u8##x
+#define MPT_U8LITERAL(x) u8##x
+#define MPT_U8STRING(x)  std::u8string(u8##x)
+
+#else // !C++20
+
+using u8string = std::basic_string<char, mpt::common_encoding_char_traits<common_encoding::utf8>>;
+using u8char = char;
+#define MPT_U8CHAR(x)    x
+#define MPT_U8LITERAL(x) x
+#define MPT_U8STRING(x)  mpt::u8string(x)
+
+// mpt::u8string is a moderately type-safe string that is meant to contain
+// UTF-8 encoded char bytes.
+//
+// mpt::u8string is not implicitely convertible to/from std::string, but
+// it is convertible to/from C strings the same way as std::string is.
+//
+// The implementation of mpt::u8string is a compromise of compatibilty
+// with implementation-defined STL details, efficiency, source code size,
+// executable bloat, type-safety  and simplicity.
+//
+// mpt::u8string is not meant to be used directly though.
+// mpt::u8string is meant as an alternative implementaion to std::wstring
+// for implementing the unicode string type mpt::ustring.
+
+#endif // C++20
+
+
+
+#if !defined(MPT_USTRING_MODE_UTF8_FORCE) && (MPT_COMPILER_MSVC || (MPT_DETECTED_MFC && defined(UNICODE)))
+// Use wide strings for MSVC because this is the native encoding on
+// microsoft platforms.
+#define MPT_USTRING_MODE_WIDE 1
+#define MPT_USTRING_MODE_UTF8 0
+#else
+#define MPT_USTRING_MODE_WIDE 0
+#define MPT_USTRING_MODE_UTF8 1
+#endif
+
+// mpt::ustring
+//
+// mpt::ustring is a string type that can hold unicode strings.
+// It is implemented as a std::basic_string either based on wchar_t (i.e. the
+//  same as std::wstring) or a custom-defined char_traits class that is derived
+//  from std::char_traits<char>.
+// The selection of the underlying implementation is done at compile-time.
+// MPT_UCHAR, MPT_ULITERAL and MPT_USTRING are macros that ease construction
+//  of ustring char literals, ustring char array literals and ustring objects
+//  from ustring char literals that work consistently in both modes.
+//  Note that these are not supported for non-ASCII characters appearing in
+//  the macro argument.
+// Also note that, as both UTF8 and UTF16 (it is less of an issue for UTF32)
+//  are variable-length encodings and mpt::ustring is implemented as a
+//  std::basic_string, all member functions that require individual character
+//  access will not work consistently or even at all in a meaningful way.
+//  This in particular affects operator[], at(), find() and substr().
+//  The code makes no effort in preventing these or generating warnings when
+//  these are used on mpt::ustring objects. However, compiling in the
+//  respectively other mpt::ustring mode will catch most of these anyway.
+
+#if MPT_USTRING_MODE_WIDE
+#if MPT_USTRING_MODE_UTF8
+#error "MPT_USTRING_MODE_WIDE and MPT_USTRING_MODE_UTF8 are mutually exclusive."
+#endif
+
+using ustring = std::wstring;
+using uchar = wchar_t;
+#define MPT_UCHAR(x)    L##x
+#define MPT_ULITERAL(x) L##x
+#define MPT_USTRING(x)  std::wstring(L##x)
+
+#endif // MPT_USTRING_MODE_WIDE
+
+#if MPT_USTRING_MODE_UTF8
+#if MPT_USTRING_MODE_WIDE
+#error "MPT_USTRING_MODE_WIDE and MPT_USTRING_MODE_UTF8 are mutually exclusive."
+#endif
+
+using ustring = mpt::u8string;
+using uchar = mpt::u8char;
+#define MPT_UCHAR(x)    MPT_U8CHAR(x)
+#define MPT_ULITERAL(x) MPT_U8LITERAL(x)
+#define MPT_USTRING(x)  MPT_U8STRING(x)
+
+#endif // MPT_USTRING_MODE_UTF8
+
+
+
+template <typename T>
+struct make_string_type { };
+
+template <typename T, typename Ttraits>
+struct make_string_type<std::basic_string<T, Ttraits>> {
+	using type = std::basic_string<T, Ttraits>;
+};
+
+template <typename T>
+struct make_string_type<const T *> {
+	using type = std::basic_string<T>;
+};
+
+template <typename T>
+struct make_string_type<T *> {
+	using type = std::basic_string<T>;
+};
+
+template <typename T, std::size_t N>
+struct make_string_type<T[N]> {
+	using type = typename make_string_type<T *>::type;
+};
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct make_string_type<CStringW> {
+	using type = CStringW;
+};
+
+template <>
+struct make_string_type<CStringA> {
+	using type = CStringA;
+};
+
+#endif // MPT_DETECTED_MFC
+
+
+
+template <typename T>
+struct is_string_type : public std::false_type { };
+template <>
+struct is_string_type<std::string> : public std::true_type { };
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct is_string_type<std::wstring> : public std::true_type { };
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct is_string_type<std::u8string> : public std::true_type { };
+#endif // C++20
+template <>
+struct is_string_type<std::u16string> : public std::true_type { };
+template <>
+struct is_string_type<std::u32string> : public std::true_type { };
+#if MPT_DETECTED_MFC
+template <>
+struct is_string_type<CStringW> : public std::true_type { };
+template <>
+struct is_string_type<CStringA> : public std::true_type { };
+#endif // MPT_DETECTED_MFC
+template <typename T, typename Ttraits>
+struct is_string_type<std::basic_string<T, Ttraits>> : public std::true_type { };
+
+
+
+template <typename T>
+inline typename mpt::make_string_type<T>::type as_string(const T & str) {
+	if constexpr (std::is_pointer<typename std::remove_cv<T>::type>::value) {
+		return str ? typename mpt::make_string_type<T>::type{str} : typename mpt::make_string_type<T>::type{};
+	} else {
+		return str;
+	}
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TYPES_HPP

Property changes on: src/mpt/string/types.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/utility.hpp
===================================================================
--- src/mpt/string/utility.hpp	(nonexistent)
+++ src/mpt/string/utility.hpp	(working copy)
@@ -0,0 +1,334 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_UTILITY_HPP
+#define MPT_STRING_UTILITY_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+// string_traits abstract the API of underlying string classes, in particular they allow adopting to CString without having to specialize for CString explicitly
+
+template <typename Tstring>
+struct string_traits {
+
+	using string_type = Tstring;
+	using size_type = typename string_type::size_type;
+	using char_type = typename string_type::value_type;
+
+	static inline std::size_t length(const string_type & str) {
+		return str.length();
+	}
+
+	static inline void reserve(string_type & str, std::size_t size) {
+		str.reserve(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		return str.append(a);
+	}
+	static inline string_type & append(string_type & str, string_type && a) {
+		return str.append(std::move(a));
+	}
+	static inline string_type & append(string_type & str, std::size_t count, char_type c) {
+		return str.append(count, c);
+	}
+
+	static inline string_type pad(string_type str, std::size_t left, std::size_t right) {
+		str.insert(str.begin(), left, char_type(' '));
+		str.insert(str.end(), right, char_type(' '));
+		return str;
+	}
+};
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct string_traits<CStringA> {
+
+	using string_type = CStringA;
+	using size_type = int;
+	using char_type = typename CStringA::XCHAR;
+
+	static inline size_type length(const string_type & str) {
+		return str.GetLength();
+	}
+
+	static inline void reserve(string_type & str, size_type size) {
+		str.Preallocate(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		str += a;
+		return str;
+	}
+	static inline string_type & append(string_type & str, size_type count, char_type c) {
+		while (count--) {
+			str.AppendChar(c);
+		}
+		return str;
+	}
+
+	static inline string_type pad(const string_type & str, size_type left, size_type right) {
+		string_type tmp;
+		while (left--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		tmp += str;
+		while (right--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		return tmp;
+	}
+};
+
+template <>
+struct string_traits<CStringW> {
+
+	using string_type = CStringW;
+	using size_type = int;
+	using char_type = typename CStringW::XCHAR;
+
+	static inline size_type length(const string_type & str) {
+		return str.GetLength();
+	}
+
+	static inline void reserve(string_type & str, size_type size) {
+		str.Preallocate(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		str += a;
+		return str;
+	}
+	static inline string_type & append(string_type & str, size_type count, char_type c) {
+		while (count--) {
+			str.AppendChar(c);
+		}
+		return str;
+	}
+
+	static inline string_type pad(const string_type & str, size_type left, size_type right) {
+		string_type tmp;
+		while (left--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		tmp += str;
+		while (right--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		return tmp;
+	}
+};
+
+#endif // MPT_DETECTED_MFC
+
+
+template <typename Tchar>
+struct char_constants {
+	static inline constexpr Tchar space = ' ';
+	static inline constexpr Tchar a = 'a';
+	static inline constexpr Tchar z = 'z';
+	static inline constexpr Tchar A = 'A';
+	static inline constexpr Tchar Z = 'Z';
+	static inline constexpr Tchar lf = '\n';
+	static inline constexpr Tchar cr = '\r';
+	static inline constexpr Tchar tab = '\t';
+	static inline constexpr Tchar comma = ',';
+};
+
+template <>
+struct char_constants<char> {
+	static inline constexpr char space = ' ';
+	static inline constexpr char a = 'a';
+	static inline constexpr char z = 'z';
+	static inline constexpr char A = 'A';
+	static inline constexpr char Z = 'Z';
+	static inline constexpr char lf = '\n';
+	static inline constexpr char cr = '\r';
+	static inline constexpr char tab = '\t';
+	static inline constexpr char comma = ',';
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct char_constants<wchar_t> {
+	static inline constexpr wchar_t space = L' ';
+	static inline constexpr wchar_t a = L'a';
+	static inline constexpr wchar_t z = L'z';
+	static inline constexpr wchar_t A = L'A';
+	static inline constexpr wchar_t Z = L'Z';
+	static inline constexpr wchar_t lf = L'\n';
+	static inline constexpr wchar_t cr = L'\r';
+	static inline constexpr wchar_t tab = L'\t';
+	static inline constexpr wchar_t comma = L',';
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct char_constants<char8_t> {
+	static inline constexpr char8_t space = u8' ';
+	static inline constexpr char8_t a = u8'a';
+	static inline constexpr char8_t z = u8'z';
+	static inline constexpr char8_t A = u8'A';
+	static inline constexpr char8_t Z = u8'Z';
+	static inline constexpr char8_t lf = u8'\n';
+	static inline constexpr char8_t cr = u8'\r';
+	static inline constexpr char8_t tab = u8'\t';
+	static inline constexpr char8_t comma = u8',';
+};
+#endif
+
+template <>
+struct char_constants<char16_t> {
+	static inline constexpr char16_t space = u' ';
+	static inline constexpr char16_t a = u'a';
+	static inline constexpr char16_t z = u'z';
+	static inline constexpr char16_t A = u'A';
+	static inline constexpr char16_t Z = u'Z';
+	static inline constexpr char16_t lf = u'\n';
+	static inline constexpr char16_t cr = u'\r';
+	static inline constexpr char16_t tab = u'\t';
+	static inline constexpr char16_t comma = u',';
+};
+
+template <>
+struct char_constants<char32_t> {
+	static inline constexpr char32_t space = U' ';
+	static inline constexpr char32_t a = U'a';
+	static inline constexpr char32_t z = U'z';
+	static inline constexpr char32_t A = U'A';
+	static inline constexpr char32_t Z = U'Z';
+	static inline constexpr char32_t lf = U'\n';
+	static inline constexpr char32_t cr = U'\r';
+	static inline constexpr char32_t tab = U'\t';
+	static inline constexpr char32_t comma = U',';
+};
+
+
+template <typename Tstring>
+inline Tstring default_whitespace() {
+	Tstring result;
+	result.reserve(4);
+	result.push_back(char_constants<typename Tstring::value_type>::space);
+	result.push_back(char_constants<typename Tstring::value_type>::lf);
+	result.push_back(char_constants<typename Tstring::value_type>::cr);
+	result.push_back(char_constants<typename Tstring::value_type>::tab);
+	return result;
+}
+
+
+// Remove whitespace at start of string
+template <typename Tstring>
+inline Tstring trim_left(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	typename Tstring::size_type pos = str.find_first_not_of(whitespace);
+	if (pos != Tstring::npos) {
+		str.erase(str.begin(), str.begin() + pos);
+	} else if (pos == Tstring::npos && str.length() > 0 && str.find_last_of(whitespace) == str.length() - 1) {
+		return Tstring();
+	}
+	return str;
+}
+
+// Remove whitespace at end of string
+template <typename Tstring>
+inline Tstring trim_right(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	typename Tstring::size_type pos = str.find_last_not_of(whitespace);
+	if (pos != Tstring::npos) {
+		str.erase(str.begin() + pos + 1, str.end());
+	} else if (pos == Tstring::npos && str.length() > 0 && str.find_first_of(whitespace) == 0) {
+		return Tstring();
+	}
+	return str;
+}
+
+// Remove whitespace at start and end of string
+template <typename Tstring>
+inline Tstring trim(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	return trim_right(trim_left(str, whitespace), whitespace);
+}
+
+
+template <typename Tstring, typename Tmatch>
+inline bool starts_with(const Tstring & str, const Tmatch & match) {
+	return (str.find(typename mpt::make_string_type<Tmatch>::type{match}) == 0);
+}
+
+template <typename Tstring, typename Tmatch>
+inline bool ends_with(const Tstring & str, const Tmatch & match) {
+	return (str.rfind(typename mpt::make_string_type<Tmatch>::type{match}) == (str.length() - typename mpt::make_string_type<Tmatch>::type{match}.length()));
+}
+
+
+template <typename Tchar>
+inline constexpr Tchar to_lower_ascii(Tchar c) noexcept {
+	if (char_constants<Tchar>::A <= c && c <= char_constants<Tchar>::Z) {
+		c += char_constants<Tchar>::a - char_constants<Tchar>::A;
+	}
+	return c;
+}
+
+template <typename Tchar>
+inline constexpr Tchar to_upper_ascii(Tchar c) noexcept {
+	if (char_constants<Tchar>::a <= c && c <= char_constants<Tchar>::z) {
+		c -= char_constants<Tchar>::a - char_constants<Tchar>::A;
+	}
+	return c;
+}
+
+
+
+template <typename Tstring>
+inline std::vector<Tstring> split(const Tstring & str, const Tstring & sep = Tstring(1, char_constants<typename Tstring::value_type>::comma)) {
+	std::vector<Tstring> vals;
+	std::size_t pos = 0;
+	while (str.find(sep, pos) != std::string::npos) {
+		vals.push_back(str.substr(pos, str.find(sep, pos) - pos));
+		pos = str.find(sep, pos) + sep.length();
+	}
+	if (!vals.empty() || (str.substr(pos).length() > 0)) {
+		vals.push_back(str.substr(pos));
+	}
+	return vals;
+}
+
+
+
+template <typename Tstring>
+inline Tstring combine(const std::vector<Tstring> & vals, const Tstring & sep = Tstring(1, char_constants<typename Tstring::value_type>::comma)) {
+	Tstring str;
+	for (std::size_t i = 0; i < vals.size(); ++i) {
+		if (i > 0) {
+			str += sep;
+		}
+		str += vals[i];
+	}
+	return str;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_UTILITY_HPP

Property changes on: src/mpt/string/utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/system_error/system_error.hpp
===================================================================
--- src/mpt/system_error/system_error.hpp	(nonexistent)
+++ src/mpt/system_error/system_error.hpp	(working copy)
@@ -0,0 +1,170 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP
+#define MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/format_message.hpp"
+#include "mpt/string/format_message_macros.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+
+#if MPT_OS_WINDOWS
+#include <stdexcept>
+#if MPT_OS_WINDOWS_WINRT
+#include <vector>
+#endif // MPT_OS_WINDOWS_WINRT
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+
+namespace windows {
+
+
+
+inline mpt::ustring GetErrorMessage(DWORD errorCode, HANDLE hModule = NULL) {
+#if MPT_OS_WINDOWS_WINRT
+	std::vector<TCHAR> msgbuf(65536);
+	if (FormatMessage(
+			(hModule ? FORMAT_MESSAGE_FROM_HMODULE : 0) | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+			hModule,
+			errorCode,
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+			msgbuf.data(),
+			mpt::saturate_cast<DWORD>(msgbuf.size()),
+			NULL)
+		== 0)
+	{
+		DWORD e = GetLastError();
+		if ((e == ERROR_NOT_ENOUGH_MEMORY) || (e == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		return {};
+	}
+	return mpt::convert<mpt::ustring>(mpt::winstring{msgbuf.data()});
+#else
+	mpt::ustring message;
+	void * lpMsgBuf = nullptr;
+	if (FormatMessage(
+			FORMAT_MESSAGE_ALLOCATE_BUFFER | (hModule ? FORMAT_MESSAGE_FROM_HMODULE : 0) | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+			hModule,
+			errorCode,
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+			(LPTSTR)&lpMsgBuf,
+			0,
+			NULL)
+		== 0)
+	{
+		DWORD e = GetLastError();
+		if (lpMsgBuf) {
+			LocalFree(lpMsgBuf);
+		}
+		if ((e == ERROR_NOT_ENOUGH_MEMORY) || (e == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		return {};
+	}
+	if (!lpMsgBuf) {
+		return {};
+	}
+	try {
+		message = mpt::convert<mpt::ustring>(mpt::winstring{static_cast<LPTSTR>(lpMsgBuf)});
+	} catch (mpt::out_of_memory e) {
+		LocalFree(lpMsgBuf);
+		mpt::rethrow_out_of_memory(e);
+	}
+	LocalFree(lpMsgBuf);
+	return message;
+#endif
+}
+
+
+class error
+	: public std::runtime_error {
+public:
+	error(DWORD errorCode, HANDLE hModule = NULL)
+		: std::runtime_error(mpt::convert<std::string>(mpt::exception_encoding, MPT_UFORMAT_MESSAGE("Windows Error: 0x{}: {}")(mpt::format<mpt::ustring>::hex0<8>(errorCode), GetErrorMessage(errorCode, hModule)))) {
+		return;
+	}
+};
+
+
+inline HANDLE CheckFileHANDLE(HANDLE handle) {
+	if (handle == INVALID_HANDLE_VALUE) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+	return handle;
+}
+
+
+inline HANDLE CheckHANDLE(HANDLE handle) {
+	if (handle == NULL) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+	return handle;
+}
+
+
+inline void CheckBOOL(BOOL result) {
+	if (result == FALSE) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+}
+
+
+inline void ExpectError(DWORD expected) {
+	DWORD err = ::GetLastError();
+	if (err != expected) {
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+}
+
+
+
+} // namespace windows
+
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP

Property changes on: src/mpt/system_error/system_error.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/test/test.hpp
===================================================================
--- src/mpt/test/test.hpp	(nonexistent)
+++ src/mpt/test/test.hpp	(working copy)
@@ -0,0 +1,549 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_TEST_TEST_HPP
+#define MPT_TEST_TEST_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/source_location.hpp"
+
+#include <functional>
+#include <iostream>
+#include <map>
+#include <sstream>
+#include <stdexcept>
+#include <type_traits>
+#include <typeinfo>
+#include <utility>
+#include <variant>
+
+#include <cstddef>
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace test {
+
+
+
+template <typename S, typename T, typename = void>
+struct is_to_stream_writable : std::false_type { };
+
+template <typename S, typename T>
+struct is_to_stream_writable<S, T, std::void_t<decltype(std::declval<S &>() << std::declval<T>())>> : std::true_type { };
+
+template <typename T>
+inline auto format(const T & x) -> typename std::enable_if<mpt::test::is_to_stream_writable<std::ostringstream, T>::value, std::string>::type {
+	std::ostringstream s;
+	s << x;
+	return s.str();
+}
+
+template <typename T>
+inline auto format(const T & x) -> typename std::enable_if<!mpt::test::is_to_stream_writable<std::ostringstream, T>::value, std::string>::type {
+	return typeid(x).name();
+}
+
+inline std::string get_exception_text() {
+	std::string result;
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		result = e.what();
+	} catch (...) {
+		result = "unknown exception";
+	}
+	return result;
+}
+
+struct result_success {
+};
+struct result_failure {
+	std::string text{};
+};
+struct result_unexpected_exception {
+	std::string text{};
+};
+
+struct result {
+	std::variant<std::monostate, result_success, result_failure, result_unexpected_exception> info{std::monostate{}};
+};
+
+struct statistics_counters {
+	std::size_t total{0};
+	std::size_t run{0};
+	std::size_t successes{0};
+	std::size_t failures{0};
+	std::size_t unexpected_exceptions{0};
+	std::size_t completed{0};
+	constexpr statistics_counters & operator+=(const statistics_counters & other) noexcept {
+		total += other.total;
+		run += other.run;
+		successes += other.successes;
+		failures += other.failures;
+		unexpected_exceptions += other.unexpected_exceptions;
+		completed += other.completed;
+		return *this;
+	}
+};
+
+struct group_statistics {
+	statistics_counters tests{};
+	statistics_counters cases{};
+	statistics_counters local_cases{};
+};
+
+struct global_statistics {
+	statistics_counters groups{};
+	statistics_counters tests{};
+	statistics_counters cases{};
+	std::map<std::string, group_statistics> individual_group_statistics{};
+	explicit constexpr operator bool() noexcept {
+		return succeeded();
+	}
+	constexpr bool operator!() noexcept {
+		return failed();
+	}
+	constexpr bool succeeded() noexcept {
+		return groups.successes == groups.run;
+	}
+	constexpr bool failed() noexcept {
+		return groups.failures > 0 || groups.unexpected_exceptions > 0;
+	}
+};
+
+class reporter_interface {
+protected:
+	virtual ~reporter_interface() = default;
+
+public:
+	virtual void run_begin(const mpt::source_location & loc) = 0;
+	virtual void group_begin(const mpt::source_location & loc, const char * name) = 0;
+	virtual void test_begin(const mpt::source_location & loc, const char * name) = 0;
+	virtual void case_run(const mpt::source_location & loc) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_e) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_ex, const char * text_e) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_a, const char * text_cmp, const char * text_b) = 0;
+	virtual void case_result(const mpt::source_location & loc, const mpt::test::result & result) = 0;
+	virtual void test_end(const mpt::source_location & loc, const char * name, const statistics_counters & counters) = 0;
+	virtual void group_end(const mpt::source_location & loc, const char * name, const group_statistics & statistics) = 0;
+	virtual void run_end(const mpt::source_location & loc, const global_statistics & statistics) = 0;
+	virtual void immediate_breakpoint() = 0;
+};
+
+class silent_reporter
+	: public reporter_interface {
+public:
+	silent_reporter() = default;
+	~silent_reporter() override = default;
+
+public:
+	virtual void run_begin(const mpt::source_location &) override {
+	}
+	virtual void group_begin(const mpt::source_location &, const char *) override {
+	}
+	virtual void test_begin(const mpt::source_location &, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *, const char *, const char *) override {
+	}
+	virtual void case_result(const mpt::source_location &, const mpt::test::result &) override {
+	}
+	virtual void test_end(const mpt::source_location &, const char *, const statistics_counters &) override {
+	}
+	virtual void group_end(const mpt::source_location &, const char *, const group_statistics &) override {
+	}
+	virtual void run_end(const mpt::source_location &, const global_statistics &) override {
+	}
+	virtual void immediate_breakpoint() override {
+	}
+};
+
+class simple_reporter : public reporter_interface {
+private:
+	std::ostream & s;
+
+public:
+	simple_reporter(std::ostream & s_)
+		: s(s_) {
+		s.flush();
+	}
+	~simple_reporter() override {
+		s.flush();
+	}
+
+public:
+	void run_begin(const mpt::source_location & loc) override {
+		static_cast<void>(loc);
+		s << "Running test suite ..." << std::endl;
+	}
+	void group_begin(const mpt::source_location & loc, const char * name) override {
+		static_cast<void>(loc);
+		s << "Running group '" << name << "' ..." << std::endl;
+	}
+	void test_begin(const mpt::source_location & loc, const char * name) override {
+		static_cast<void>(loc);
+		s << " Running test '" << name << "' ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc) override {
+		static_cast<void>(loc);
+		s << "  Checking ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc, const char * text_e) override {
+		static_cast<void>(loc);
+		s << "  Checking '" << text_e << "' ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc, const char * text_ex, const char * text_e) override {
+		static_cast<void>(loc);
+		if (text_ex) {
+			s << "  Checking '" << text_e << " throws " << text_ex << "' ..." << std::endl;
+		} else {
+			s << "  Checking '" << text_e << " throws' ..." << std::endl;
+		}
+	}
+	void case_run(const mpt::source_location & loc, const char * text_a, const char * text_cmp, const char * text_b) override {
+		static_cast<void>(loc);
+		s << "  Checking '" << text_a << " " << text_cmp << " " << text_b << "' ..." << std::endl;
+	}
+	void case_result(const mpt::source_location & loc, const mpt::test::result & result) override {
+		static_cast<void>(loc);
+		s << "  Checking done: ";
+		if (std::holds_alternative<result_success>(result.info)) {
+			s << "Success.";
+		} else if (std::holds_alternative<result_failure>(result.info)) {
+			s << "FAILURE: " << std::get<result_failure>(result.info).text;
+		} else if (std::holds_alternative<result_unexpected_exception>(result.info)) {
+			s << "UNEXPECTED EXCEPTION: " << std::get<result_unexpected_exception>(result.info).text;
+		}
+		s << std::endl;
+	}
+	void test_end(const mpt::source_location & loc, const char * name, const statistics_counters & counters) override {
+		static_cast<void>(loc);
+		static_cast<void>(counters);
+		s << " Running test '" << name << "' done." << std::endl;
+	}
+	void group_end(const mpt::source_location & loc, const char * name, const group_statistics & statistics) override {
+		static_cast<void>(loc);
+		static_cast<void>(statistics);
+		s << "Running group '" << name << "' done." << std::endl;
+	}
+	void run_end(const mpt::source_location & loc, const global_statistics & statistics) override {
+		static_cast<void>(loc);
+		s << "Running test suite done." << std::endl;
+		s << "groups: " << statistics.groups.total << " | " << statistics.groups.successes << " passed";
+		if (statistics.groups.failures || statistics.groups.unexpected_exceptions) {
+			s << " | " << statistics.groups.failures << " FAILED";
+			if (statistics.groups.unexpected_exceptions) {
+				s << " | " << statistics.groups.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+		s << "tests: " << statistics.tests.total << " | " << statistics.tests.successes << " passed";
+		if (statistics.tests.failures || statistics.tests.unexpected_exceptions) {
+			s << " | " << statistics.tests.failures << " FAILED";
+			if (statistics.tests.unexpected_exceptions) {
+				s << " | " << statistics.tests.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+		s << "checks: " << statistics.cases.total << " | " << statistics.cases.successes << " passed";
+		if (statistics.cases.failures || statistics.cases.unexpected_exceptions) {
+			s << " | " << statistics.cases.failures << " FAILED";
+			if (statistics.cases.unexpected_exceptions) {
+				s << " | " << statistics.cases.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+	}
+	void immediate_breakpoint() override {
+		return;
+	}
+};
+
+struct group;
+
+struct context {
+	mpt::test::group & group;
+	mpt::test::reporter_interface & reporter;
+	mpt::test::group_statistics statistics{};
+};
+
+using void_context_function = void (*)(mpt::test::context &);
+
+struct group {
+	group * next{nullptr};
+	const char * name{""};
+	void_context_function func{nullptr};
+	inline group(const char * name_, void_context_function f)
+		: name(name_)
+		, func(f) {
+		next = group_list();
+		group_list() = this;
+	}
+	group_statistics run(mpt::test::reporter_interface & reporter, const mpt::source_location & loc = mpt::source_location::current()) {
+		mpt::test::context context{*this, reporter};
+		context.reporter.group_begin(loc, name);
+		if (func) {
+			func(context);
+		}
+		context.reporter.group_end(loc, name, context.statistics);
+		return context.statistics;
+	}
+
+public:
+	[[nodiscard]] static inline group *& group_list() noexcept {
+		static group * group_list = nullptr;
+		return group_list;
+	}
+};
+
+inline global_statistics run_all(mpt::test::reporter_interface & reporter, const mpt::source_location & loc = mpt::source_location::current()) {
+	global_statistics statistics{};
+	reporter.run_begin(loc);
+	for (group * g = group::group_list(); g; g = g->next) {
+		statistics.groups.total++;
+		statistics.groups.run++;
+		group_statistics s = g->run(reporter, loc);
+		if (s.tests.unexpected_exceptions) {
+			statistics.groups.unexpected_exceptions++;
+		} else if (s.tests.failures) {
+			statistics.groups.failures++;
+		} else {
+			statistics.groups.successes++;
+		}
+		statistics.tests += s.tests;
+		statistics.cases += s.cases;
+		statistics.groups.completed++;
+		statistics.individual_group_statistics[g->name] = s;
+	}
+	reporter.run_end(loc, statistics);
+	return statistics;
+}
+
+struct test {
+
+	mpt::test::context & context;
+	const char * name{""};
+	mpt::source_location source_location{mpt::source_location::current()};
+	void (*breakpoint)(void){nullptr};
+
+	test(const test &) = delete;
+	test & operator=(const test &) = delete;
+
+	inline test(mpt::test::context & context_, void (*breakpoint_)(void) = nullptr, const mpt::source_location & source_location_ = mpt::source_location::current())
+		: context(context_)
+		, source_location(source_location_)
+		, breakpoint(breakpoint_) {
+		report_test_begin();
+	}
+	inline test(mpt::test::context & context_, const char * name_, void (*breakpoint_)(void) = nullptr, const mpt::source_location & source_location_ = mpt::source_location::current())
+		: context(context_)
+		, name(name_)
+		, source_location(source_location_)
+		, breakpoint(breakpoint_) {
+		report_test_begin();
+	}
+
+	inline ~test() {
+		report_test_end();
+	}
+
+	void immediate_breakpoint() {
+		if (breakpoint) {
+			breakpoint();
+		} else {
+			context.reporter.immediate_breakpoint();
+		}
+	}
+
+	void report_test_begin() {
+		context.statistics.tests.total++;
+		context.statistics.tests.run++;
+		context.statistics.local_cases = statistics_counters{};
+		context.reporter.test_begin(source_location, name);
+	}
+
+	void report_run() {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location);
+	}
+	void report_run(const char * text_e) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_e);
+	}
+	void report_run(const char * text_ex, const char * text_e) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_ex, text_e);
+	}
+	void report_run(const char * text_a, const char * text_cmp, const char * text_b) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_a, text_cmp, text_b);
+	}
+
+	void report_result(mpt::test::result result) {
+		if (std::holds_alternative<result_success>(result.info)) {
+			context.statistics.local_cases.successes++;
+		} else if (std::holds_alternative<result_failure>(result.info)) {
+			context.statistics.local_cases.failures++;
+		} else if (std::holds_alternative<result_unexpected_exception>(result.info)) {
+			context.statistics.local_cases.unexpected_exceptions++;
+		}
+		context.statistics.local_cases.completed++;
+		context.reporter.case_result(source_location, result);
+	}
+
+	void report_test_end() {
+		context.statistics.cases += context.statistics.local_cases;
+		if (context.statistics.local_cases.unexpected_exceptions) {
+			context.statistics.tests.unexpected_exceptions++;
+		} else if (context.statistics.local_cases.failures) {
+			context.statistics.tests.failures++;
+		} else {
+			context.statistics.tests.successes++;
+		}
+		context.statistics.tests.completed++;
+		context.reporter.test_end(source_location, name, context.statistics.local_cases);
+	}
+
+	template <typename Texception, typename Tcallable, typename std::enable_if<std::is_invocable<Tcallable>::value, bool>::type = true>
+	inline test & expect_throws(Tcallable c, const char * text_ex = nullptr, const char * text_e = nullptr) {
+		report_run(text_ex ? text_ex : typeid(Texception).name(), text_e ? text_e : typeid(decltype(c())).name());
+		mpt::test::result result;
+		try {
+			c();
+			immediate_breakpoint();
+			result.info = mpt::test::result_failure{};
+		} catch (const Texception &) {
+			result.info = mpt::test::result_success{};
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Tcallable, typename std::enable_if<std::is_invocable<Tcallable>::value, bool>::type = true>
+	inline test & expect_throws_any(Tcallable c, const char * text_e = nullptr) {
+		report_run(nullptr, text_e ? text_e : typeid(decltype(c())).name());
+		mpt::test::result result;
+		try {
+			c();
+			immediate_breakpoint();
+			result.info = mpt::test::result_failure{};
+		} catch (...) {
+			result.info = mpt::test::result_success{};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Texpr, typename std::enable_if<std::is_invocable<Texpr>::value, bool>::type = true>
+	inline test & expect(Texpr e, const char * text_e = nullptr) {
+		report_run(text_e ? text_e : typeid(decltype(std::invoke(e))).name());
+		mpt::test::result result;
+		try {
+			const auto ve = std::invoke(e);
+			if (!ve) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{/*mpt::test::format(ve)*/};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Ta, typename Tcmp, typename Tb, typename std::enable_if<std::is_invocable<Ta>::value, bool>::type = true, typename std::enable_if<std::is_invocable<Tb>::value, bool>::type = true>
+	inline test & expect(Ta && a, Tcmp cmp, Tb && b, const char * text_a = nullptr, const char * text_cmp = nullptr, const char * text_b = nullptr) {
+		report_run(text_a ? text_a : typeid(decltype(std::invoke(a))).name(), text_cmp ? text_cmp : typeid(decltype(cmp)).name(), text_b ? text_b : typeid(decltype(std::invoke(b))).name());
+		mpt::test::result result;
+		try {
+			const auto va = std::invoke(a);
+			const auto vb = std::invoke(b);
+			if (!cmp(va, vb)) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{mpt::test::format(va) + " " + mpt::test::format(cmp) + " " + mpt::test::format(vb)};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Texpr, typename std::enable_if<!std::is_invocable<Texpr>::value, bool>::type = true>
+	inline test & expect(Texpr && e, const char * text_e = nullptr) {
+		report_run(text_e ? text_e : typeid(decltype(std::forward<Texpr>(e))).name());
+		mpt::test::result result;
+		try {
+			const auto ve = std::forward<Texpr>(e);
+			if (!ve) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{/*mpt::test::format(ve)*/};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Ta, typename Tcmp, typename Tb, typename std::enable_if<!std::is_invocable<Ta>::value, bool>::type = true, typename std::enable_if<!std::is_invocable<Tb>::value, bool>::type = true>
+	inline test & expect(Ta && a, Tcmp cmp, Tb && b, const char * text_a = nullptr, const char * text_cmp = nullptr, const char * text_b = nullptr) {
+		report_run(text_a ? text_a : typeid(decltype(std::forward<Ta>(a))).name(), text_cmp ? text_cmp : typeid(decltype(cmp)).name(), text_b ? text_b : typeid(decltype(std::forward<Tb>(b))).name());
+		mpt::test::result result;
+		try {
+			const auto va = std::forward<Ta>(a);
+			const auto vb = std::forward<Tb>(b);
+			if (!cmp(va, vb)) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{mpt::test::format(va) + " " + mpt::test::format(cmp) + " " + mpt::test::format(vb)};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+};
+
+
+} // namespace test
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_TEST_TEST_HPP

Property changes on: src/mpt/test/test.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/test/test_macros.hpp
===================================================================
--- src/mpt/test/test_macros.hpp	(nonexistent)
+++ src/mpt/test/test_macros.hpp	(working copy)
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_TEST_TEST_MACROS_HPP
+#define MPT_TEST_TEST_MACROS_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/preprocessor.hpp"
+#include "mpt/test/test.hpp"
+
+#include <functional>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace test {
+
+
+#define MPT_TEST_GROUP_BEGIN(name) \
+	inline mpt::test::group MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_name) { \
+		name, [](mpt::test::context & context) {
+#define MPT_TEST_GROUP_END() \
+	} \
+	} \
+	;
+
+// #define MPT_TEST_GROUP(name) inline void MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(mpt::test::context & context); inline mpt::test::group MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_name){name, [](mpt::test::context & context) { MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(context); }}; inline void MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(mpt::test::context & context)
+
+#define MPT_TEST_DELAYED(x) [&] { \
+	return x; \
+}
+
+#define MPT_TEST_EXPECT mpt::test::test{context}.expect
+
+#define MPT_TEST_EXPECT_EXPR(e)                 mpt::test::test{context}.expect([&] { return e; }, #e)
+#define MPT_TEST_EXPECT_CMP(a, cmp, b)          mpt::test::test{context}.expect([&] { return a; }, [](const auto & a_, const auto & b_) { return a_ cmp b_; }, [&] { return b; }, #a, #cmp, #b)
+#define MPT_TEST_EXPECT_THROWS_ANY(expr)        mpt::test::test{context}.expect_throws_any([&] { expr; }, #expr)
+#define MPT_TEST_EXPECT_THROWS(exception, expr) mpt::test::test{context}.expect_throws<exception>([&] { expr; }, #exception, #expr)
+
+#define MPT_TEST_EXPECT_EQUAL(a, b) mpt::test::test{context}.expect([&] { return a; }, std::equal_to<>{}, [&] { return b; }, #a, "==", #b)
+
+
+} // namespace test
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_TEST_TEST_MACROS_HPP

Property changes on: src/mpt/test/test_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/guid.hpp
===================================================================
--- src/mpt/uuid/guid.hpp	(nonexistent)
+++ src/mpt/uuid/guid.hpp	(working copy)
@@ -0,0 +1,284 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_GUID_HPP
+#define MPT_UUID_GUID_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <stdexcept>
+#include <vector>
+
+#if MPT_OS_WINDOWS
+#include <guiddef.h>
+#include <objbase.h>
+#include <rpc.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+
+// COM CLSID<->string conversion
+// A CLSID string is not necessarily a standard UUID string,
+// it might also be a symbolic name for the interface.
+// (see CLSIDFromString ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms680589%28v=vs.85%29.aspx ))
+
+inline mpt::winstring CLSIDToString(CLSID clsid) {
+	std::wstring str;
+	LPOLESTR tmp = nullptr;
+	switch (::StringFromCLSID(clsid, &tmp)) {
+		case S_OK:
+			break;
+		case E_OUTOFMEMORY:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			mpt::throw_out_of_memory();
+			break;
+		default:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			throw std::logic_error("StringFromCLSID() failed.");
+			break;
+	}
+	if (!tmp) {
+		throw std::logic_error("StringFromCLSID() failed.");
+	}
+	try {
+		str = tmp;
+	} catch (mpt::out_of_memory e) {
+		::CoTaskMemFree(tmp);
+		tmp = nullptr;
+		mpt::rethrow_out_of_memory(e);
+	}
+	::CoTaskMemFree(tmp);
+	tmp = nullptr;
+	return mpt::convert<mpt::winstring>(str);
+}
+
+inline CLSID StringToCLSID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	CLSID clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			// nothing
+			break;
+		case E_INVALIDARG:
+			clsid = CLSID();
+			break;
+		case CO_E_CLASSSTRING:
+			clsid = CLSID();
+			break;
+		case REGDB_E_CLASSNOTREG:
+			clsid = CLSID();
+			break;
+		case REGDB_E_READREGDB:
+			clsid = CLSID();
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			clsid = CLSID();
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return clsid;
+}
+
+inline bool VerifyStringToCLSID(const mpt::winstring & str_, CLSID & clsid) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	bool result = false;
+	clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			result = true;
+			break;
+		case E_INVALIDARG:
+			result = false;
+			break;
+		case CO_E_CLASSSTRING:
+			result = false;
+			break;
+		case REGDB_E_CLASSNOTREG:
+			result = false;
+			break;
+		case REGDB_E_READREGDB:
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return result;
+}
+
+inline bool IsCLSID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	bool result = false;
+	CLSID clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			result = true;
+			break;
+		case E_INVALIDARG:
+			result = false;
+			break;
+		case CO_E_CLASSSTRING:
+			result = false;
+			break;
+		case REGDB_E_CLASSNOTREG:
+			result = false;
+			break;
+		case REGDB_E_READREGDB:
+			result = false;
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			result = false;
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return result;
+}
+
+
+// COM IID<->string conversion
+
+inline IID StringToIID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	IID iid = IID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::IIDFromString(tmp.data(), &iid)) {
+		case S_OK:
+			// nothing
+			break;
+		case E_OUTOFMEMORY:
+			iid = IID();
+			mpt::throw_out_of_memory();
+			break;
+		case E_INVALIDARG:
+			iid = IID();
+			break;
+		default:
+			iid = IID();
+			throw std::logic_error("IIDFromString() failed.");
+			break;
+	}
+	return iid;
+}
+
+inline mpt::winstring IIDToString(IID iid) {
+	std::wstring str;
+	LPOLESTR tmp = nullptr;
+	switch (::StringFromIID(iid, &tmp)) {
+		case S_OK:
+			break;
+		case E_OUTOFMEMORY:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			mpt::throw_out_of_memory();
+			break;
+		default:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			throw std::logic_error("StringFromIID() failed.");
+			break;
+	}
+	if (!tmp) {
+		throw std::logic_error("StringFromIID() failed.");
+	}
+	try {
+		str = tmp;
+	} catch (mpt::out_of_memory e) {
+		::CoTaskMemFree(tmp);
+		tmp = nullptr;
+		mpt::rethrow_out_of_memory(e);
+	}
+	return mpt::convert<mpt::winstring>(str);
+}
+
+
+// General GUID<->string conversion.
+// The string must/will be in standard GUID format: {4F9A455D-E7EF-4367-B2F0-0C83A38A5C72}
+
+inline GUID StringToGUID(const mpt::winstring & str) {
+	return StringToIID(str);
+}
+
+inline mpt::winstring GUIDToString(GUID guid) {
+	std::vector<OLECHAR> tmp(256);
+	if (::StringFromGUID2(guid, tmp.data(), static_cast<int>(tmp.size())) <= 0) {
+		throw std::logic_error("StringFromGUID2() failed.");
+	}
+	return mpt::convert<mpt::winstring>(tmp.data());
+}
+
+
+// Create a COM GUID
+
+inline GUID CreateGUID() {
+	GUID guid = GUID();
+	switch (::CoCreateGuid(&guid)) {
+		case S_OK:
+			// nothing
+			break;
+		default:
+			guid = GUID();
+			throw std::runtime_error("CoCreateGuid() failed.");
+	}
+	return guid;
+}
+
+
+// Checks the UUID against the NULL UUID. Returns false if it is NULL, true otherwise.
+
+inline bool IsValid(::UUID uuid) {
+	return false
+		|| uuid.Data1 != 0
+		|| uuid.Data2 != 0
+		|| uuid.Data3 != 0
+		|| uuid.Data4[0] != 0
+		|| uuid.Data4[1] != 0
+		|| uuid.Data4[2] != 0
+		|| uuid.Data4[3] != 0
+		|| uuid.Data4[4] != 0
+		|| uuid.Data4[5] != 0
+		|| uuid.Data4[6] != 0
+		|| uuid.Data4[7] != 0;
+}
+
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_GUID_HPP

Property changes on: src/mpt/uuid/guid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/tests/tests_uuid.hpp
===================================================================
--- src/mpt/uuid/tests/tests_uuid.hpp	(nonexistent)
+++ src/mpt/uuid/tests/tests_uuid.hpp	(working copy)
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_UUID_HPP
+#define MPT_BASE_TESTS_UUID_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+#include "mpt/uuid/guid.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <cstddef>
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_uuid{
+	"mpt/uuid",
+	[](mpt::test::context & context) {
+		using namespace mpt::uuid_literals;
+
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull).ToUString(), MPT_USTRING("2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"));
+#if MPT_OS_WINDOWS
+		constexpr mpt::UUID uuid_tmp = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid_tmp);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(mpt::StringToGUID(TEXT("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(mpt::StringToCLSID(TEXT("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull), mpt::UUID(mpt::StringToGUID(TEXT("{00112233-4455-6677-8899-AABBCCDDEEFF}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull), mpt::UUID(mpt::StringToGUID(TEXT("{00112233-4455-6677-C899-AABBCCDDEEFF}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull)), TEXT("{00112233-4455-6677-8899-AABBCCDDEEFF}"));
+		MPT_TEST_EXPECT_EQUAL(mpt::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull)), TEXT("{00112233-4455-6677-C899-AABBCCDDEEFF}"));
+#endif // MPT_OS_WINDOWS
+
+		mpt::sane_random_device rd;
+		mpt::good_engine prng = mpt::make_prng<mpt::good_engine>(rd);
+
+#if MPT_OS_WINDOWS
+		MPT_TEST_EXPECT_EQUAL(mpt::IsValid(mpt::CreateGUID()), true);
+		{
+			mpt::UUID uuid = mpt::UUID::Generate(prng);
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID::FromString(mpt::UUID(uuid).ToUString()));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToGUID(mpt::GUIDToString(uuid))));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToIID(mpt::IIDToString(uuid))));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToCLSID(mpt::CLSIDToString(uuid))));
+		}
+		{
+			GUID guid = mpt::UUID::Generate(prng);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, static_cast<GUID>(mpt::UUID::FromString(mpt::UUID(guid).ToUString()))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToGUID(mpt::GUIDToString(guid))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToIID(mpt::IIDToString(guid))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToCLSID(mpt::CLSIDToString(guid))), TRUE);
+		}
+#endif // MPT_OS_WINDOWS
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::Generate(prng).IsValid(), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::GenerateLocalUseOnly(prng).IsValid(), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::Generate(prng) != mpt::UUID::Generate(prng), true);
+		mpt::UUID a = mpt::UUID::Generate(prng);
+		MPT_TEST_EXPECT_EQUAL(a, mpt::UUID::FromString(a.ToUString()));
+		std::byte uuiddata[16]{};
+		for (std::size_t i = 0; i < 16; ++i) {
+			uuiddata[i] = mpt::byte_cast<std::byte>(static_cast<uint8>(i));
+		}
+		static_assert(sizeof(mpt::UUID) == 16);
+		mpt::UUIDbin uuid2;
+		std::memcpy(&uuid2, uuiddata, 16);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(uuid2).ToUString(), MPT_USTRING("00010203-0405-0607-0809-0a0b0c0d0e0f"));
+
+		constexpr mpt::UUID uuid3 = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid3);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_UUID_HPP

Property changes on: src/mpt/uuid/tests/tests_uuid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/uuid.hpp
===================================================================
--- src/mpt/uuid/uuid.hpp	(nonexistent)
+++ src/mpt/uuid/uuid.hpp	(working copy)
@@ -0,0 +1,386 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_UUID_HPP
+#define MPT_UUID_UUID_HPP
+
+
+
+#include "mpt/base/constexpr_throw.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/random/random.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/parse.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#if MPT_OS_WINDOWS
+#include <guiddef.h>
+#include <objbase.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Microsoft on-disk layout
+struct GUIDms {
+	uint32le Data1;
+	uint16le Data2;
+	uint16le Data3;
+	uint64be Data4; // yes, big endian here
+};
+constexpr bool declare_binary_safe(const GUIDms &) {
+	return true;
+}
+static_assert(mpt::check_binary_size<GUIDms>(16));
+
+// RFC binary format
+struct UUIDbin {
+	uint32be Data1;
+	uint16be Data2;
+	uint16be Data3;
+	uint64be Data4;
+};
+constexpr bool declare_binary_safe(const UUIDbin &) {
+	return true;
+}
+static_assert(mpt::check_binary_size<UUIDbin>(16));
+
+
+
+struct UUID {
+private:
+	uint32 Data1;
+	uint16 Data2;
+	uint16 Data3;
+	uint64 Data4;
+
+public:
+	MPT_CONSTEXPRINLINE uint32 GetData1() const noexcept {
+		return Data1;
+	}
+	MPT_CONSTEXPRINLINE uint16 GetData2() const noexcept {
+		return Data2;
+	}
+	MPT_CONSTEXPRINLINE uint16 GetData3() const noexcept {
+		return Data3;
+	}
+	MPT_CONSTEXPRINLINE uint64 GetData4() const noexcept {
+		return Data4;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE uint64 GetData64_1() const noexcept {
+		return (static_cast<uint64>(Data1) << 32) | (static_cast<uint64>(Data2) << 16) | (static_cast<uint64>(Data3) << 0);
+	}
+	MPT_CONSTEXPRINLINE uint64 GetData64_2() const noexcept {
+		return Data4;
+	}
+
+public:
+	// xxxxxxxx-xxxx-Mmxx-Nnxx-xxxxxxxxxxxx
+	// <--32-->-<16>-<16>-<-------64------>
+	MPT_CONSTEXPRINLINE bool IsNil() const noexcept {
+		return (Data1 == 0) && (Data2 == 0) && (Data3 == 0) && (Data4 == 0);
+	}
+	MPT_CONSTEXPRINLINE bool IsValid() const noexcept {
+		return (Data1 != 0) || (Data2 != 0) || (Data3 != 0) || (Data4 != 0);
+	}
+	MPT_CONSTEXPRINLINE uint8 Variant() const noexcept {
+		return Nn() >> 4u;
+	}
+	MPT_CONSTEXPRINLINE uint8 Version() const noexcept {
+		return Mm() >> 4u;
+	}
+	MPT_CONSTEXPRINLINE bool IsRFC4122() const noexcept {
+		return (Variant() & 0xcu) == 0x8u;
+	}
+
+private:
+	MPT_CONSTEXPRINLINE uint8 Mm() const noexcept {
+		return static_cast<uint8>((Data3 >> 8) & 0xffu);
+	}
+	MPT_CONSTEXPRINLINE uint8 Nn() const noexcept {
+		return static_cast<uint8>((Data4 >> 56) & 0xffu);
+	}
+	void MakeRFC4122(uint8 version) noexcept {
+		// variant
+		uint8 Nn = static_cast<uint8>((Data4 >> 56) & 0xffu);
+		Data4 &= 0x00ffffffffffffffull;
+		Nn &= ~(0xc0u);
+		Nn |= 0x80u;
+		Data4 |= static_cast<uint64>(Nn) << 56;
+		// version
+		version &= 0x0fu;
+		uint8 Mm = static_cast<uint8>((Data3 >> 8) & 0xffu);
+		Data3 &= 0x00ffu;
+		Mm &= ~(0xf0u);
+		Mm |= (version << 4u);
+		Data3 |= static_cast<uint16>(Mm) << 8;
+	}
+#if MPT_OS_WINDOWS
+private:
+	static mpt::UUID UUIDFromWin32(::UUID uuid) {
+		return mpt::UUID(uuid.Data1, uuid.Data2, uuid.Data3, (static_cast<uint64>(0) | (static_cast<uint64>(uuid.Data4[0]) << 56) | (static_cast<uint64>(uuid.Data4[1]) << 48) | (static_cast<uint64>(uuid.Data4[2]) << 40) | (static_cast<uint64>(uuid.Data4[3]) << 32) | (static_cast<uint64>(uuid.Data4[4]) << 24) | (static_cast<uint64>(uuid.Data4[5]) << 16) | (static_cast<uint64>(uuid.Data4[6]) << 8) | (static_cast<uint64>(uuid.Data4[7]) << 0)));
+	}
+	static ::UUID UUIDToWin32(mpt::UUID uuid) {
+		::UUID result = ::UUID();
+		result.Data1 = uuid.GetData1();
+		result.Data2 = uuid.GetData2();
+		result.Data3 = uuid.GetData3();
+		result.Data4[0] = static_cast<uint8>(uuid.GetData4() >> 56);
+		result.Data4[1] = static_cast<uint8>(uuid.GetData4() >> 48);
+		result.Data4[2] = static_cast<uint8>(uuid.GetData4() >> 40);
+		result.Data4[3] = static_cast<uint8>(uuid.GetData4() >> 32);
+		result.Data4[4] = static_cast<uint8>(uuid.GetData4() >> 24);
+		result.Data4[5] = static_cast<uint8>(uuid.GetData4() >> 16);
+		result.Data4[6] = static_cast<uint8>(uuid.GetData4() >> 8);
+		result.Data4[7] = static_cast<uint8>(uuid.GetData4() >> 0);
+		return result;
+	}
+
+public:
+	explicit UUID(::UUID uuid) {
+		*this = UUIDFromWin32(uuid);
+	}
+	operator ::UUID() const {
+		return UUIDToWin32(*this);
+	}
+#endif // MPT_OS_WINDOWS
+private:
+	static MPT_CONSTEXPRINLINE uint8 NibbleFromChar(char x) {
+		return ('0' <= x && x <= '9') ? static_cast<uint8>(x - '0' + 0) : ('a' <= x && x <= 'z') ? static_cast<uint8>(x - 'a' + 10)
+			: ('A' <= x && x <= 'Z')                                                             ? static_cast<uint8>(x - 'A' + 10)
+																								 : mpt::constexpr_throw<uint8>(std::domain_error(""));
+	}
+	static MPT_CONSTEXPRINLINE uint8 ByteFromHex(char x, char y) {
+		return static_cast<uint8>(uint8(0) | (NibbleFromChar(x) << 4) | (NibbleFromChar(y) << 0));
+	}
+	static MPT_CONSTEXPRINLINE uint16 ParseHex16(const char * str) {
+		return static_cast<uint16>(uint16(0) | (static_cast<uint16>(ByteFromHex(str[0], str[1])) << 8) | (static_cast<uint16>(ByteFromHex(str[2], str[3])) << 0));
+	}
+	static MPT_CONSTEXPRINLINE uint32 ParseHex32(const char * str) {
+		return static_cast<uint32>(uint32(0) | (static_cast<uint32>(ByteFromHex(str[0], str[1])) << 24) | (static_cast<uint32>(ByteFromHex(str[2], str[3])) << 16) | (static_cast<uint32>(ByteFromHex(str[4], str[5])) << 8) | (static_cast<uint32>(ByteFromHex(str[6], str[7])) << 0));
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE UUID ParseLiteral(const char * str, std::size_t len) {
+		return (len == 36 && str[8] == '-' && str[13] == '-' && str[18] == '-' && str[23] == '-') ? mpt::UUID(
+				   ParseHex32(str + 0),
+				   ParseHex16(str + 9),
+				   ParseHex16(str + 14),
+				   uint64(0)
+					   | (static_cast<uint64>(ParseHex16(str + 19)) << 48)
+					   | (static_cast<uint64>(ParseHex16(str + 24)) << 32)
+					   | (static_cast<uint64>(ParseHex32(str + 28)) << 0))
+																								  : mpt::constexpr_throw<mpt::UUID>(std::domain_error(""));
+	}
+
+public:
+	MPT_CONSTEXPRINLINE UUID() noexcept
+		: Data1(0)
+		, Data2(0)
+		, Data3(0)
+		, Data4(0) {
+		return;
+	}
+	MPT_CONSTEXPRINLINE explicit UUID(uint32 Data1, uint16 Data2, uint16 Data3, uint64 Data4) noexcept
+		: Data1(Data1)
+		, Data2(Data2)
+		, Data3(Data3)
+		, Data4(Data4) {
+		return;
+	}
+	explicit UUID(UUIDbin uuid) {
+		Data1 = uuid.Data1.get();
+		Data2 = uuid.Data2.get();
+		Data3 = uuid.Data3.get();
+		Data4 = uuid.Data4.get();
+	}
+	explicit UUID(GUIDms guid) {
+		Data1 = guid.Data1.get();
+		Data2 = guid.Data2.get();
+		Data3 = guid.Data3.get();
+		Data4 = guid.Data4.get();
+	}
+	operator UUIDbin() const {
+		UUIDbin result{};
+		result.Data1 = GetData1();
+		result.Data2 = GetData2();
+		result.Data3 = GetData3();
+		result.Data4 = GetData4();
+		return result;
+	}
+	operator GUIDms() const {
+		GUIDms result{};
+		result.Data1 = GetData1();
+		result.Data2 = GetData2();
+		result.Data3 = GetData3();
+		result.Data4 = GetData4();
+		return result;
+	}
+
+public:
+	// Create a UUID
+	template <typename Trng>
+	static UUID Generate(Trng & rng) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+#if (_WIN32_WINNT >= 0x0602)
+		::GUID guid = ::GUID();
+		HRESULT result = CoCreateGuid(&guid);
+		if (result != S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(guid);
+#else
+		return mpt::UUID::RFC4122Random(rng);
+#endif
+#elif MPT_OS_WINDOWS && !MPT_OS_WINDOWS_WINRT
+		::UUID uuid = ::UUID();
+		RPC_STATUS status = ::UuidCreate(&uuid);
+		if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		status = RPC_S_OK;
+		if (UuidIsNil(&uuid, &status) != FALSE) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		if (status != RPC_S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(uuid);
+#else
+		return RFC4122Random(rng);
+#endif
+	}
+	// Create a UUID that contains local, traceable information.
+	// Safe for local use. May be faster.
+	template <typename Trng>
+	static UUID GenerateLocalUseOnly(Trng & rng) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+#if (_WIN32_WINNT >= 0x0602)
+		::GUID guid = ::GUID();
+		HRESULT result = CoCreateGuid(&guid);
+		if (result != S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(guid);
+#else
+		return mpt::UUID::RFC4122Random(rng);
+#endif
+#elif MPT_OS_WINDOWS && !MPT_OS_WINDOWS_WINRT
+#if _WIN32_WINNT >= 0x0501
+		// Available since Win2000, but we check for WinXP in order to not use this
+		// function in Win32old builds. It is not available on some non-fully
+		// patched Win98SE installs in the wild.
+		::UUID uuid = ::UUID();
+		RPC_STATUS status = ::UuidCreateSequential(&uuid);
+		if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) {
+			return Generate(rng);
+		}
+		status = RPC_S_OK;
+		if (UuidIsNil(&uuid, &status) != FALSE) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		if (status != RPC_S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(uuid);
+#else
+		// Fallback to ::UuidCreate is safe as ::UuidCreateSequential is only a
+		// tiny performance optimization.
+		return Generate(rng);
+#endif
+#else
+		return RFC4122Random(rng);
+#endif
+	}
+	// Create a RFC4122 Random UUID.
+	template <typename Trng>
+	static UUID RFC4122Random(Trng & prng) {
+		UUID result;
+		result.Data1 = mpt::random<uint32>(prng);
+		result.Data2 = mpt::random<uint16>(prng);
+		result.Data3 = mpt::random<uint16>(prng);
+		result.Data4 = mpt::random<uint64>(prng);
+		result.MakeRFC4122(4);
+		return result;
+	}
+	friend UUID UUIDRFC4122NamespaceV3(const UUID & ns, const mpt::ustring & name);
+	friend UUID UUIDRFC4122NamespaceV5(const UUID & ns, const mpt::ustring & name);
+
+public:
+	// General UUID<->string conversion.
+	// The string must/will be in standard UUID format: 4f9a455d-e7ef-4367-b2f0-0c83a38a5c72
+	static UUID FromString(const mpt::ustring & str) {
+		std::vector<mpt::ustring> segments = mpt::split<mpt::ustring>(str, MPT_ULITERAL("-"));
+		if (segments.size() != 5) {
+			return UUID();
+		}
+		if (segments[0].length() != 8) {
+			return UUID();
+		}
+		if (segments[1].length() != 4) {
+			return UUID();
+		}
+		if (segments[2].length() != 4) {
+			return UUID();
+		}
+		if (segments[3].length() != 4) {
+			return UUID();
+		}
+		if (segments[4].length() != 12) {
+			return UUID();
+		}
+		UUID result;
+		result.Data1 = mpt::ConvertHexStringTo<uint32>(segments[0]);
+		result.Data2 = mpt::ConvertHexStringTo<uint16>(segments[1]);
+		result.Data3 = mpt::ConvertHexStringTo<uint16>(segments[2]);
+		result.Data4 = mpt::ConvertHexStringTo<uint64>(segments[3] + segments[4]);
+		return result;
+	}
+	mpt::ustring ToUString() const {
+		return mpt::ustring()
+			+ mpt::format<mpt::ustring>::hex0<8>(GetData1())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(GetData2())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(GetData3())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 48))
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 32))
+			+ mpt::format<mpt::ustring>::hex0<8>(static_cast<uint32>(GetData4() >> 0));
+	}
+};
+
+MPT_CONSTEXPRINLINE bool operator==(const mpt::UUID & a, const mpt::UUID & b) noexcept {
+	return (a.GetData1() == b.GetData1()) && (a.GetData2() == b.GetData2()) && (a.GetData3() == b.GetData3()) && (a.GetData4() == b.GetData4());
+}
+
+MPT_CONSTEXPRINLINE bool operator!=(const mpt::UUID & a, const mpt::UUID & b) noexcept {
+	return (a.GetData1() != b.GetData1()) || (a.GetData2() != b.GetData2()) || (a.GetData3() != b.GetData3()) || (a.GetData4() != b.GetData4());
+}
+
+
+namespace uuid_literals {
+
+MPT_CONSTEXPRINLINE mpt::UUID operator"" _uuid(const char * str, std::size_t len) {
+	return mpt::UUID::ParseLiteral(str, len);
+}
+
+} // namespace uuid_literals
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_UUID_HPP

Property changes on: src/mpt/uuid/uuid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
===================================================================
--- src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp	(nonexistent)
+++ src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp	(working copy)
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_UUID_NAMESPACE_HPP
+#define MPT_BASE_TESTS_UUID_NAMESPACE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+#include "mpt/uuid/uuid.hpp"
+#include "mpt/uuid_namespace/uuid_namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_uuid_namespace{
+	"mpt/uuid_namespace",
+	[](mpt::test::context & context) {
+		{
+			constexpr mpt::UUID uuid_ns_dns = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"_uuid;
+			constexpr mpt::UUID expected = "74738ff5-5367-5958-9aee-98fffdcd1876"_uuid;
+			mpt::UUID gotten = mpt::UUIDRFC4122NamespaceV5(uuid_ns_dns, MPT_USTRING("www.example.org"));
+			MPT_TEST_EXPECT_EQUAL(gotten, expected);
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_UUID_NAMESPACE_HPP

Property changes on: src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid_namespace/uuid_namespace.hpp
===================================================================
--- src/mpt/uuid_namespace/uuid_namespace.hpp	(nonexistent)
+++ src/mpt/uuid_namespace/uuid_namespace.hpp	(working copy)
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP
+#define MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <algorithm>
+#include <array>
+#include <string>
+#include <vector>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+// Create a RFC4122 Version 3 namespace UUID
+inline mpt::UUID UUIDRFC4122NamespaceV3(const mpt::UUID & ns, const mpt::ustring & name) {
+	mpt::UUIDbin binns = ns;
+	std::vector<std::byte> buf;
+	buf.resize(sizeof(mpt::UUIDbin));
+	std::copy(mpt::as_raw_memory(binns).data(), mpt::as_raw_memory(binns).data() + sizeof(mpt::UUIDbin), buf.data());
+	std::string utf8name = mpt::convert<std::string>(mpt::common_encoding::utf8, name);
+	buf.resize(buf.size() + utf8name.length());
+	std::transform(utf8name.begin(), utf8name.end(), buf.data() + sizeof(mpt::UUIDbin), [](char c) { return mpt::byte_cast<std::byte>(c); });
+	std::array<std::byte, 16> hash = mpt::crypto::hash::MD5().process(mpt::as_span(buf)).result();
+	mpt::UUIDbin uuidbin;
+	std::copy(hash.begin(), hash.begin() + 16, mpt::as_raw_memory(uuidbin).data());
+	mpt::UUID uuid{uuidbin};
+	uuid.MakeRFC4122(3);
+	return uuid;
+}
+
+// Create a RFC4122 Version 5 namespace UUID
+inline mpt::UUID UUIDRFC4122NamespaceV5(const mpt::UUID & ns, const mpt::ustring & name) {
+	mpt::UUIDbin binns = ns;
+	std::vector<std::byte> buf;
+	buf.resize(sizeof(mpt::UUIDbin));
+	std::copy(mpt::as_raw_memory(binns).data(), mpt::as_raw_memory(binns).data() + sizeof(mpt::UUIDbin), buf.data());
+	std::string utf8name = mpt::convert<std::string>(mpt::common_encoding::utf8, name);
+	buf.resize(buf.size() + utf8name.length());
+	std::transform(utf8name.begin(), utf8name.end(), buf.data() + sizeof(mpt::UUIDbin), [](char c) { return mpt::byte_cast<std::byte>(c); });
+	std::array<std::byte, 20> hash = mpt::crypto::hash::SHA1().process(mpt::as_span(buf)).result();
+	UUIDbin uuidbin;
+	std::copy(hash.begin(), hash.begin() + 16, mpt::as_raw_memory(uuidbin).data());
+	mpt::UUID uuid{uuidbin};
+	uuid.MakeRFC4122(5);
+	return uuid;
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP

Property changes on: src/mpt/uuid_namespace/uuid_namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/.clang-format
===================================================================
--- src/mpt/.clang-format	(nonexistent)
+++ src/mpt/.clang-format	(working copy)
@@ -0,0 +1,130 @@
+Language: Cpp
+Standard: c++17
+
+AccessModifierOffset: -4 #?
+AlignAfterOpenBracket: AlwaysBreak
+AlignConsecutiveAssignments: false
+AlignConsecutiveBitFields: false
+AlignConsecutiveDeclarations: false
+AlignConsecutiveMacros: true
+AlignEscapedNewlines: DontAlign
+AlignOperands: DontAlign
+AlignTrailingComments: true
+AllowAllArgumentsOnNextLine: true
+AllowAllConstructorInitializersOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: Never
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortEnumsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: Empty
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLambdasOnASingleLine: Inline
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: true
+AlwaysBreakTemplateDeclarations: Yes
+BinPackArguments: true
+BinPackParameters: false
+BraceWrapping:
+ AfterCaseLabel: false
+ AfterClass: false
+ AfterControlStatement: MultiLine
+ AfterEnum: false
+ AfterFunction: false
+ AfterNamespace: false
+ #AfterObjCDeclaration
+ AfterStruct: false
+ AfterUnion: false
+ AfterExternBlock: false
+ BeforeCatch: false
+ BeforeElse: false
+ BeforeLambdaBody: false
+ BeforeWhile: false
+ IndentBraces: false
+ SplitEmptyFunction: true
+ SplitEmptyRecord: false
+ SplitEmptyNamespace: true
+#BreakAfterJavaFieldAnnotations
+BreakBeforeBinaryOperators: NonAssignment
+BreakBeforeBraces: Custom
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializers: BeforeComma
+BreakInheritanceList: BeforeComma
+BreakStringLiterals: false
+ColumnLimit: 0
+CommentPragmas: '' #?
+CompactNamespaces: false
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+ConstructorInitializerIndentWidth: 4 #?
+ContinuationIndentWidth: 4 #?
+Cpp11BracedListStyle: true
+DeriveLineEnding: true
+DerivePointerAlignment: false
+FixNamespaceComments: true
+ForEachMacros: []
+IncludeBlocks: Preserve
+IncludeCategories: [] #?
+IncludeIsMainRegex: '' #?
+IncludeIsMainSourceRegex: '' #?
+IndentCaseLabels: true
+IndentCaseBlocks: true
+IndentExternBlock: NoIndent
+IndentGotoLabels: false
+IndentPPDirectives: None
+InsertTrailingCommas: None
+#BeforeHash
+IndentWidth: 4
+IndentWrappedFunctionNames: true
+#JavaImportGroups
+#JavaScriptQuotes
+#JavaScriptWrapImports
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: '^MPT_TEST_GROUP_BEGIN$' #?
+MacroBlockEnd: '^MPT_TEST_GROUP_END$' #?
+MaxEmptyLinesToKeep: 5
+NamespaceIndentation: None
+NamespaceMacros: [] #?
+#ObjCBinPackProtocolList
+#ObjCBlockIndentWidth
+#ObjCBreakBeforeNestedBlockParam
+#ObjCSpaceAfterProperty
+#ObjCSpaceBeforeProtocolList
+#PenaltyBreakAssignment
+#PenaltyBreakBeforeFirstCallParameter
+#PenaltyBreakComment
+#PenaltyBreakFirstLessLess
+#PenaltyBreakString
+#PenaltyBreakTemplateDeclaration
+#PenaltyExcessCharacter
+#PenaltyReturnTypeOnItsOwnLine
+PointerAlignment: Middle
+#RawStringFormats
+ReflowComments: false
+SortIncludes: false
+SortUsingDeclarations: true
+SpaceAfterCStyleCast: false
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: ControlStatements
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceBeforeSquareBrackets: false
+SpaceInEmptyBlock: true
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: false
+SpacesInCStyleCastParentheses: false
+SpacesInConditionalStatement: false
+SpacesInContainerLiterals: true
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+StatementMacros: [ '_Pragma', '__pragma', MPT_WARNING ] #?
+TabWidth: 4
+TypenameMacros: [] #?
+UseCRLF: false
+UseTab: ForContinuationAndIndentation
+WhitespaceSensitiveMacros:
+  - MPT_PP_STRINGIFY

Property changes on: src/mpt/.clang-format
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-clang-format
\ No newline at end of property
Index: src/mpt/LICENSE.BSD-3-Clause.txt
===================================================================
--- src/mpt/LICENSE.BSD-3-Clause.txt	(nonexistent)
+++ src/mpt/LICENSE.BSD-3-Clause.txt	(working copy)
@@ -0,0 +1,25 @@
+Copyright (c) 2004-2021, OpenMPT Project Developers and Contributors
+Copyright (c) 1997-2003, Olivier Lapicque
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the OpenMPT project nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.

Property changes on: src/mpt/LICENSE.BSD-3-Clause.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: src/mpt/LICENSE.BSL-1.0.txt
===================================================================
--- src/mpt/LICENSE.BSL-1.0.txt	(nonexistent)
+++ src/mpt/LICENSE.BSL-1.0.txt	(working copy)
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.

Property changes on: src/mpt/LICENSE.BSL-1.0.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: src/mpt/base/algorithm.hpp
===================================================================
--- src/mpt/base/algorithm.hpp	(nonexistent)
+++ src/mpt/base/algorithm.hpp	(working copy)
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ALGORITHM_HPP
+#define MPT_BASE_ALGORITHM_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/saturate_cast.hpp"
+
+#include <algorithm>
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Grows x with an exponential factor suitable for increasing buffer sizes.
+// Clamps the result at limit.
+// And avoids integer overflows while doing its business.
+// The growth factor is 1.5, rounding down, execpt for the initial x==1 case.
+template <typename T, typename Tlimit>
+inline T exponential_grow(const T & x, const Tlimit & limit) {
+	if (x <= 1) {
+		return 2;
+	}
+	T add = std::min(x >> 1, std::numeric_limits<T>::max() - x);
+	return std::min(x + add, mpt::saturate_cast<T>(limit));
+}
+
+template <typename T>
+inline T exponential_grow(const T & x) {
+	return mpt::exponential_grow(x, std::numeric_limits<T>::max());
+}
+
+
+// Check if val is in [lo,hi] without causing compiler warnings
+// if theses checks are always true due to the domain of T.
+// GCC does not warn if the type is templated.
+template <typename T, typename C>
+constexpr bool is_in_range(const T & val, const C & lo, const C & hi) {
+	return lo <= val && val <= hi;
+}
+
+
+template <typename Tcontainer, typename Tval>
+MPT_CONSTEXPR20_FUN bool contains(const Tcontainer & container, const Tval & value) noexcept(noexcept(std::find(std::begin(container), std::end(container), value))) {
+	return std::find(std::begin(container), std::end(container), value) != std::end(container);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALGORITHM_HPP

Property changes on: src/mpt/base/algorithm.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/alloc.hpp
===================================================================
--- src/mpt/base/alloc.hpp	(nonexistent)
+++ src/mpt/base/alloc.hpp	(working copy)
@@ -0,0 +1,157 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ALLOC_HPP
+#define MPT_BASE_ALLOC_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/span.hpp"
+
+#include <iterator>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T>
+inline mpt::span<T> as_span(std::vector<T> & cont) {
+	return mpt::span<T>(cont.data(), cont.data() + cont.size());
+}
+
+template <typename T>
+inline mpt::span<const T> as_span(const std::vector<T> & cont) {
+	return mpt::span<const T>(cont.data(), cont.data() + cont.size());
+}
+
+template <typename T>
+inline span<T> as_span(std::basic_string<T> & str) {
+	return span<T>(str.data(), str.size());
+}
+
+template <typename T>
+inline span<const T> as_span(const std::basic_string<T> & str) {
+	return span<const T>(str.data(), str.size());
+}
+
+
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T * beg, T * end) {
+	return std::vector<typename std::remove_const<T>::type>(beg, end);
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T * data, std::size_t size) {
+	return std::vector<typename std::remove_const<T>::type>(data, data + size);
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(mpt::span<T> data) {
+	return std::vector<typename std::remove_const<T>::type>(data.data(), data.data() + data.size());
+}
+
+template <typename T, std::size_t N>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T (&arr)[N]) {
+	return std::vector<typename std::remove_const<T>::type>(std::begin(arr), std::end(arr));
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(const std::basic_string<T> & str) {
+	return std::vector<typename std::remove_const<T>::type>(str.begin(), str.end());
+}
+
+
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T * beg, T * end) {
+	return std::basic_string<typename std::remove_const<T>::type>(beg, end);
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T * data, std::size_t size) {
+	return std::basic_string<typename std::remove_const<T>::type>(data, data + size);
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(mpt::span<T> data) {
+	return std::basic_string<typename std::remove_const<T>::type>(data.data(), data.data() + data.size());
+}
+
+template <typename T, std::size_t N>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T (&arr)[N]) {
+	return std::basic_string<typename std::remove_const<T>::type>(std::begin(arr), std::end(arr));
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(const std::vector<T> & str) {
+	return std::vector<typename std::remove_const<T>::type>(str.begin(), str.end());
+}
+
+
+
+template <typename Tcont2, typename Tcont1>
+inline Tcont1 & append(Tcont1 & cont1, const Tcont2 & cont2) {
+	cont1.insert(cont1.end(), cont2.begin(), cont2.end());
+	return cont1;
+}
+
+template <typename Tit2, typename Tcont1>
+inline Tcont1 & append(Tcont1 & cont1, Tit2 beg, Tit2 end) {
+	cont1.insert(cont1.end(), beg, end);
+	return cont1;
+}
+
+
+
+template <typename Tdst, typename Tsrc>
+struct buffer_cast_impl {
+	inline Tdst operator()(const Tsrc & src) const {
+		return Tdst(mpt::byte_cast<const typename Tdst::value_type *>(src.data()), mpt::byte_cast<const typename Tdst::value_type *>(src.data()) + src.size());
+	}
+};
+
+// casts between vector<->string of byte-castable types
+template <typename Tdst, typename Tsrc>
+inline Tdst buffer_cast(Tsrc src) {
+	return buffer_cast_impl<Tdst, Tsrc>()(src);
+}
+
+
+
+template <typename T>
+struct as_raw_memory_impl<std::vector<T>> {
+	inline mpt::const_byte_span operator()(const std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+	inline mpt::byte_span operator()(std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+};
+
+template <typename T>
+struct as_raw_memory_impl<const std::vector<T>> {
+	inline mpt::const_byte_span operator()(const std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALLOC_HPP

Property changes on: src/mpt/base/alloc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/arithmetic_shift.hpp
===================================================================
--- src/mpt/base/arithmetic_shift.hpp	(nonexistent)
+++ src/mpt/base/arithmetic_shift.hpp	(working copy)
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ARITHMETIC_SHIFT_HPP
+#define MPT_BASE_ARITHMETIC_SHIFT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/saturate_cast.hpp"
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// mpt::rshift_signed
+// mpt::lshift_signed
+// Shift a signed integer value in a well-defined manner.
+// Does the same thing as MSVC would do. This is verified by the test suite.
+
+template <typename T>
+constexpr auto rshift_signed_standard(T x, int y) noexcept -> decltype(x >> y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	using result_type = decltype(x >> y);
+	using unsigned_result_type = typename std::make_unsigned<result_type>::type;
+	const unsigned_result_type roffset = static_cast<unsigned_result_type>(1) << ((sizeof(result_type) * 8) - 1);
+	result_type rx = x;
+	unsigned_result_type urx = static_cast<unsigned_result_type>(rx);
+	urx += roffset;
+	urx >>= y;
+	urx -= roffset >> y;
+	return static_cast<result_type>(urx);
+}
+
+template <typename T>
+constexpr auto lshift_signed_standard(T x, int y) noexcept -> decltype(x << y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	using result_type = decltype(x << y);
+	using unsigned_result_type = typename std::make_unsigned<result_type>::type;
+	const unsigned_result_type roffset = static_cast<unsigned_result_type>(1) << ((sizeof(result_type) * 8) - 1);
+	result_type rx = x;
+	unsigned_result_type urx = static_cast<unsigned_result_type>(rx);
+	urx += roffset;
+	urx <<= y;
+	urx -= roffset << y;
+	return static_cast<result_type>(urx);
+}
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+template <typename T>
+constexpr auto rshift_signed_undefined(T x, int y) noexcept -> decltype(x >> y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	return x >> y;
+}
+
+template <typename T>
+constexpr auto lshift_signed_undefined(T x, int y) noexcept -> decltype(x << y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	return x << y;
+}
+
+template <typename T>
+constexpr auto rshift_signed(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed_undefined(x, y);
+}
+
+template <typename T>
+constexpr auto lshift_signed(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed_undefined(x, y);
+}
+
+#else
+
+template <typename T>
+constexpr auto rshift_signed(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed_standard(x, y);
+}
+
+template <typename T>
+constexpr auto lshift_signed(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed_standard(x, y);
+}
+
+#endif
+
+template <typename T>
+constexpr auto arithmetic_shift_right(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto arithmetic_shift_right(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto sar(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto sal(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed(x, y);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ARITHMETIC_SHIFT_HPP

Property changes on: src/mpt/base/arithmetic_shift.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/array.hpp
===================================================================
--- src/mpt/base/array.hpp	(nonexistent)
+++ src/mpt/base/array.hpp	(working copy)
@@ -0,0 +1,82 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ARRAY_HPP
+#define MPT_BASE_ARRAY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename T>
+struct stdarray_extent : std::integral_constant<std::size_t, 0> { };
+
+template <typename T, std::size_t N>
+struct stdarray_extent<std::array<T, N>> : std::integral_constant<std::size_t, N> { };
+
+template <typename T>
+struct is_stdarray : std::false_type { };
+
+template <typename T, std::size_t N>
+struct is_stdarray<std::array<T, N>> : std::true_type { };
+
+// mpt::extent is the same as std::extent,
+// but also works for std::array,
+// and asserts that the given type is actually an array type instead of returning 0.
+// use as:
+// mpt::extent<decltype(expr)>()
+// mpt::extent<decltype(variable)>()
+// mpt::extent<decltype(type)>()
+// mpt::extent<type>()
+template <typename T>
+constexpr std::size_t extent() noexcept {
+	using Tarray = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
+	static_assert(std::is_array<Tarray>::value || mpt::is_stdarray<Tarray>::value);
+	if constexpr (mpt::is_stdarray<Tarray>::value) {
+		return mpt::stdarray_extent<Tarray>();
+	} else {
+		return std::extent<Tarray>();
+	}
+}
+
+template <typename>
+struct array_size;
+
+template <typename T, std::size_t N>
+struct array_size<std::array<T, N>> {
+	static constexpr std::size_t size = N;
+};
+
+template <typename T, std::size_t N>
+struct array_size<T[N]> {
+	static constexpr std::size_t size = N;
+};
+
+
+template <typename T, std::size_t N, typename Tx>
+constexpr std::array<T, N> init_array(const Tx & x) {
+	std::array<T, N> result{};
+	for (std::size_t i = 0; i < N; ++i) {
+		result[i] = x;
+	}
+	return result;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ARRAY_HPP

Property changes on: src/mpt/base/array.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/bit.hpp
===================================================================
--- src/mpt/base/bit.hpp	(nonexistent)
+++ src/mpt/base/bit.hpp	(working copy)
@@ -0,0 +1,392 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_BIT_HPP
+#define MPT_BASE_BIT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/macros.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <bit>
+#else // !C++20
+#include <array>
+#include <limits>
+#endif // C++20
+#include <type_traits>
+
+#include <cstddef>
+#if MPT_CXX_BEFORE(20)
+#include <cstring>
+#endif // !C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+using std::bit_cast;
+#else
+// C++2a compatible bit_cast.
+// Not implementing constexpr because this is not easily possible pre C++20.
+template <typename Tdst, typename Tsrc>
+MPT_FORCEINLINE typename std::enable_if<(sizeof(Tdst) == sizeof(Tsrc)) && std::is_trivially_copyable<Tsrc>::value && std::is_trivially_copyable<Tdst>::value, Tdst>::type bit_cast(const Tsrc & src) noexcept {
+	Tdst dst{};
+	std::memcpy(&dst, &src, sizeof(Tdst));
+	return dst;
+}
+#endif
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::endian;
+
+static_assert(mpt::endian::big != mpt::endian::little, "platform with all scalar types having size 1 is not supported");
+
+constexpr mpt::endian get_endian() noexcept {
+	return mpt::endian::native;
+}
+
+constexpr bool endian_is_little() noexcept {
+	return get_endian() == mpt::endian::little;
+}
+
+constexpr bool endian_is_big() noexcept {
+	return get_endian() == mpt::endian::big;
+}
+
+constexpr bool endian_is_weird() noexcept {
+	return !endian_is_little() && !endian_is_big();
+}
+
+#else // !C++20
+
+#if !MPT_COMPILER_GENERIC
+
+#if MPT_COMPILER_MSVC
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#endif
+#endif
+
+// fallback:
+#if !defined(MPT_PLATFORM_BIG_ENDIAN) && !defined(MPT_PLATFORM_LITTLE_ENDIAN)
+// taken from boost/detail/endian.hpp
+#if (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) \
+	|| (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) \
+	|| (defined(_STLP_BIG_ENDIAN) && !defined(_STLP_LITTLE_ENDIAN))
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) \
+	|| (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) \
+	|| (defined(_STLP_LITTLE_ENDIAN) && !defined(_STLP_BIG_ENDIAN))
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#elif defined(__sparc) || defined(__sparc__) \
+	|| defined(_POWER) || defined(__powerpc__) \
+	|| defined(__ppc__) || defined(__hpux) || defined(__hppa) \
+	|| defined(_MIPSEB) || defined(_POWER) \
+	|| defined(__s390__)
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif defined(__i386__) || defined(__alpha__) \
+	|| defined(__ia64) || defined(__ia64__) \
+	|| defined(_M_IX86) || defined(_M_IA64) \
+	|| defined(_M_ALPHA) || defined(__amd64) \
+	|| defined(__amd64__) || defined(_M_AMD64) \
+	|| defined(__x86_64) || defined(__x86_64__) \
+	|| defined(_M_X64) || defined(__bfin__)
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#endif
+#endif
+
+#endif // !MPT_COMPILER_GENERIC
+
+enum class endian
+{
+	little = 0x78563412u,
+	big = 0x12345678u,
+	weird = 1u,
+#if MPT_COMPILER_GENERIC
+	native = 0u,
+#elif defined(MPT_PLATFORM_LITTLE_ENDIAN)
+	native = little,
+#elif defined(MPT_PLATFORM_BIG_ENDIAN)
+	native = big,
+#else
+	native = 0u,
+#endif
+};
+
+static_assert(mpt::endian::big != mpt::endian::little, "platform with all scalar types having size 1 is not supported");
+
+MPT_FORCEINLINE mpt::endian endian_probe() noexcept {
+	using endian_probe_type = uint32;
+	static_assert(sizeof(endian_probe_type) == 4);
+	constexpr endian_probe_type endian_probe_big = 0x12345678u;
+	constexpr endian_probe_type endian_probe_little = 0x78563412u;
+	const std::array<std::byte, sizeof(endian_probe_type)> probe{{std::byte{0x12}, std::byte{0x34}, std::byte{0x56}, std::byte{0x78}}};
+	const endian_probe_type test = mpt::bit_cast<endian_probe_type>(probe);
+	mpt::endian result = mpt::endian::native;
+	switch (test) {
+		case endian_probe_big:
+			result = mpt::endian::big;
+			break;
+		case endian_probe_little:
+			result = mpt::endian::little;
+			break;
+		default:
+			result = mpt::endian::weird;
+			break;
+	}
+	return result;
+}
+
+MPT_FORCEINLINE mpt::endian get_endian() noexcept {
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 6285) // false-positive: (<non-zero constant> || <non-zero constant>) is always a non-zero constant.
+#endif                          // MPT_COMPILER_MSVC
+	if constexpr ((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+		return mpt::endian::native;
+	} else {
+		return mpt::endian_probe();
+	}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+}
+
+MPT_FORCEINLINE bool endian_is_little() noexcept {
+	return get_endian() == mpt::endian::little;
+}
+
+MPT_FORCEINLINE bool endian_is_big() noexcept {
+	return get_endian() == mpt::endian::big;
+}
+
+MPT_FORCEINLINE bool endian_is_weird() noexcept {
+	return !endian_is_little() && !endian_is_big();
+}
+
+#endif // C++20
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::bit_ceil;
+using std::bit_floor;
+using std::bit_width;
+using std::countl_one;
+using std::countl_zero;
+using std::countr_one;
+using std::countr_zero;
+using std::has_single_bit;
+using std::popcount;
+using std::rotl;
+using std::rotr;
+
+#else // !C++20
+
+// C++20 <bit> header.
+// Note that we do not use SFINAE here but instead rely on static_assert.
+
+template <typename T>
+constexpr int popcount(T val) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int result = 0;
+	while (val > 0) {
+		if (val & 0x1) {
+			result++;
+		}
+		val >>= 1;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr bool has_single_bit(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	return mpt::popcount(x) == 1;
+}
+
+template <typename T>
+constexpr T bit_ceil(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	T result = 1;
+	while (result < x) {
+		T newresult = result << 1;
+		if (newresult < result) {
+			return 0;
+		}
+		result = newresult;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr T bit_floor(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	if (x == 0) {
+		return 0;
+	}
+	T result = 1;
+	do {
+		T newresult = result << 1;
+		if (newresult < result) {
+			return result;
+		}
+		result = newresult;
+	} while (result <= x);
+	return result >> 1;
+}
+
+template <typename T>
+constexpr T bit_width(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	T result = 0;
+	while (x > 0) {
+		x >>= 1;
+		result += 1;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr int countl_zero(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = std::numeric_limits<T>::digits - 1; bit >= 0; --bit) {
+		if ((x & (1u << bit)) == 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countl_one(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = std::numeric_limits<T>::digits - 1; bit >= 0; --bit) {
+		if ((x & (1u << bit)) != 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countr_zero(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = 0; bit < std::numeric_limits<T>::digits; ++bit) {
+		if ((x & (1u << bit)) == 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countr_one(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = 0; bit < std::numeric_limits<T>::digits; ++bit) {
+		if ((x & (1u << bit)) != 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr T rotl_impl(T x, int r) noexcept {
+	auto N = std::numeric_limits<T>::digits;
+	return (x >> (N - r)) | (x << r);
+}
+
+template <typename T>
+constexpr T rotr_impl(T x, int r) noexcept {
+	auto N = std::numeric_limits<T>::digits;
+	return (x << (N - r)) | (x >> r);
+}
+
+template <typename T>
+constexpr T rotl(T x, int s) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	auto N = std::numeric_limits<T>::digits;
+	auto r = s % N;
+	return (s < 0) ? mpt::rotr_impl(x, -s) : ((x >> (N - r)) | (x << r));
+}
+
+template <typename T>
+constexpr T rotr(T x, int s) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	auto N = std::numeric_limits<T>::digits;
+	auto r = s % N;
+	return (s < 0) ? mpt::rotl_impl(x, -s) : ((x << (N - r)) | (x >> r));
+}
+
+#endif // C++20
+
+
+
+template <typename T>
+constexpr int lower_bound_entropy_bits(T x_) {
+	typename std::make_unsigned<T>::type x = static_cast<typename std::make_unsigned<T>::type>(x_);
+	return mpt::bit_width(x) == static_cast<typename std::make_unsigned<T>::type>(mpt::popcount(x)) ? mpt::bit_width(x) : mpt::bit_width(x) - 1;
+}
+
+
+template <typename T>
+constexpr bool is_mask(T x) {
+	static_assert(std::is_integral<T>::value);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	unsigned_T ux = static_cast<unsigned_T>(x);
+	unsigned_T mask = 0;
+	for (std::size_t bits = 0; bits <= (sizeof(unsigned_T) * 8); ++bits) {
+		mask = (mask << 1) | 1u;
+		if (ux == mask) {
+			return true;
+		}
+	}
+	return false;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_BIT_HPP

Property changes on: src/mpt/base/bit.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/check_platform.hpp
===================================================================
--- src/mpt/base/check_platform.hpp	(nonexistent)
+++ src/mpt/base/check_platform.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_CHECK_PLATFORM_HPP
+#define MPT_BASE_CHECK_PLATFORM_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/pointer.hpp"
+
+#include <limits>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+static_assert(sizeof(std::uintptr_t) == sizeof(void *));
+static_assert(std::numeric_limits<unsigned char>::digits == 8);
+
+static_assert(sizeof(char) == 1);
+
+static_assert(sizeof(std::byte) == 1);
+static_assert(alignof(std::byte) == 1);
+
+static_assert(mpt::arch_bits == static_cast<int>(mpt::pointer_size) * 8);
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_CHECK_PLATFORM_HPP

Property changes on: src/mpt/base/check_platform.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/compiletime_warning.hpp
===================================================================
--- src/mpt/base/compiletime_warning.hpp	(nonexistent)
+++ src/mpt/base/compiletime_warning.hpp	(working copy)
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_COMPILETIME_WARNING_HPP
+#define MPT_BASE_COMPILETIME_WARNING_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/preprocessor.hpp"
+
+
+
+#if MPT_COMPILER_MSVC
+
+#define MPT_WARNING(text)           __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
+#define MPT_WARNING_STATEMENT(text) __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
+
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+
+#define MPT_WARNING(text)           _Pragma(MPT_PP_STRINGIFY(GCC warning text))
+#define MPT_WARNING_STATEMENT(text) _Pragma(MPT_PP_STRINGIFY(GCC warning text))
+
+#else
+
+// portable #pragma message or #warning replacement
+#define MPT_WARNING(text) \
+	static inline int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME)() noexcept { \
+		int warning [[deprecated("Warning: " text)]] = 0; \
+		return warning; \
+	} \
+/**/
+#define MPT_WARNING_STATEMENT(text) \
+	int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME) = []() { \
+		int warning [[deprecated("Warning: " text)]] = 0; \
+		return warning; \
+	}() /**/
+
+#endif
+
+
+
+#endif // MPT_BASE_COMPILETIME_WARNING_HPP

Property changes on: src/mpt/base/compiletime_warning.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/constexpr_throw.hpp
===================================================================
--- src/mpt/base/constexpr_throw.hpp	(nonexistent)
+++ src/mpt/base/constexpr_throw.hpp	(working copy)
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_CONSTEXPR_THROW_HPP
+#define MPT_BASE_CONSTEXPR_THROW_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Work-around for the requirement of at least 1 non-throwing function argument combination in C++ (17,2a).
+
+template <typename Exception>
+constexpr bool constexpr_throw_helper(Exception && e, bool really = true) {
+	//return !really ? really : throw std::forward<Exception>(e);
+	if (really) {
+		throw std::forward<Exception>(e);
+	}
+	// cppcheck-suppress identicalConditionAfterEarlyExit
+	return really;
+}
+
+template <typename Exception>
+constexpr bool constexpr_throw(Exception && e) {
+	return mpt::constexpr_throw_helper(std::forward<Exception>(e));
+}
+
+template <typename T, typename Exception>
+constexpr T constexpr_throw_helper(Exception && e, bool really = true) {
+	//return !really ? really : throw std::forward<Exception>(e);
+	if (really) {
+		throw std::forward<Exception>(e);
+	}
+	return T{};
+}
+
+template <typename T, typename Exception>
+constexpr T constexpr_throw(Exception && e) {
+	return mpt::constexpr_throw_helper<T>(std::forward<Exception>(e));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_CONSTEXPR_THROW_HPP

Property changes on: src/mpt/base/constexpr_throw.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect.hpp
===================================================================
--- src/mpt/base/detect.hpp	(nonexistent)
+++ src/mpt/base/detect.hpp	(working copy)
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_HPP
+#define MPT_BASE_DETECT_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+#include "mpt/base/detect_libcxx.hpp"
+#include "mpt/base/detect_libc.hpp"
+
+
+
+#endif // MPT_BASE_DETECT_HPP

Property changes on: src/mpt/base/detect.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_compiler.hpp
===================================================================
--- src/mpt/base/detect_compiler.hpp	(nonexistent)
+++ src/mpt/base/detect_compiler.hpp	(working copy)
@@ -0,0 +1,170 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_COMPILER_HPP
+#define MPT_BASE_DETECT_COMPILER_HPP
+
+
+
+#define MPT_COMPILER_MAKE_VERSION2(version, sp)         ((version)*100 + (sp))
+#define MPT_COMPILER_MAKE_VERSION3(major, minor, patch) ((major)*10000 + (minor)*100 + (patch))
+
+
+
+#if defined(MPT_COMPILER_GENERIC)
+
+#undef MPT_COMPILER_GENERIC
+#define MPT_COMPILER_GENERIC 1
+
+#elif defined(__clang__) && defined(_MSC_VER) && defined(__c2__)
+
+#error "Clang/C2 is not supported. Please use Clang/LLVM for Windows instead."
+
+#elif defined(__clang__)
+
+#define MPT_COMPILER_CLANG                      1
+#define MPT_COMPILER_CLANG_VERSION              MPT_COMPILER_MAKE_VERSION3(__clang_major__, __clang_minor__, __clang_patchlevel__)
+#define MPT_CLANG_AT_LEAST(major, minor, patch) (MPT_COMPILER_CLANG_VERSION >= MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+#define MPT_CLANG_BEFORE(major, minor, patch)   (MPT_COMPILER_CLANG_VERSION < MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+
+#if MPT_CLANG_BEFORE(7, 0, 0)
+#error "clang version 7 required"
+#endif
+
+#if defined(__clang_analyzer__)
+#ifndef MPT_BUILD_ANALYZED
+#define MPT_BUILD_ANALYZED
+#endif
+#endif
+
+#elif defined(__GNUC__)
+
+#define MPT_COMPILER_GCC                      1
+#define MPT_COMPILER_GCC_VERSION              MPT_COMPILER_MAKE_VERSION3(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+#define MPT_GCC_AT_LEAST(major, minor, patch) (MPT_COMPILER_GCC_VERSION >= MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+#define MPT_GCC_BEFORE(major, minor, patch)   (MPT_COMPILER_GCC_VERSION < MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+
+#if MPT_GCC_BEFORE(8, 1, 0)
+#error "GCC version 8.1 required"
+#endif
+
+#elif defined(_MSC_VER)
+
+#define MPT_COMPILER_MSVC 1
+#if (_MSC_VER >= 1926)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 6)
+#elif (_MSC_VER >= 1925)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 5)
+#elif (_MSC_VER >= 1924)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 4)
+#elif (_MSC_VER >= 1923)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 3)
+#elif (_MSC_VER >= 1922)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 2)
+#elif (_MSC_VER >= 1921)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 1)
+#elif (_MSC_VER >= 1920)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 0)
+#elif (_MSC_VER >= 1916)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 9)
+#elif (_MSC_VER >= 1915)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 8)
+#elif (_MSC_VER >= 1914)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 7)
+#elif (_MSC_VER >= 1913)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 6)
+#elif (_MSC_VER >= 1912)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 5)
+#elif (_MSC_VER >= 1911)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 3)
+#elif (_MSC_VER >= 1910)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 0)
+#elif (_MSC_VER >= 1900) && defined(_MSVC_LANG)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2015, 3)
+#elif (_MSC_VER >= 1900)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2015, 0)
+#elif (_MSC_VER >= 1800)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2013, 0)
+#elif (_MSC_VER >= 1700)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2012, 0)
+#elif (_MSC_VER >= 1600)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2010, 0)
+#elif (_MSC_VER >= 1500)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2008, 0)
+#else
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2005, 0)
+#endif
+#define MPT_MSVC_AT_LEAST(version, sp) (MPT_COMPILER_MSVC_VERSION >= MPT_COMPILER_MAKE_VERSION2((version), (sp)))
+#define MPT_MSVC_BEFORE(version, sp)   (MPT_COMPILER_MSVC_VERSION < MPT_COMPILER_MAKE_VERSION2((version), (sp)))
+
+#if MPT_MSVC_BEFORE(2017, 9)
+#error "MSVC version 2017 15.9 required"
+#endif
+
+#if defined(_PREFAST_)
+#ifndef MPT_BUILD_ANALYZED
+#define MPT_BUILD_ANALYZED
+#endif
+#endif
+
+#else
+
+#define MPT_COMPILER_GENERIC 1
+
+#endif
+
+
+
+#ifndef MPT_COMPILER_GENERIC
+#define MPT_COMPILER_GENERIC 0
+#endif
+#ifndef MPT_COMPILER_CLANG
+#define MPT_COMPILER_CLANG                      0
+#define MPT_CLANG_AT_LEAST(major, minor, patch) 0
+#define MPT_CLANG_BEFORE(major, minor, patch)   0
+#endif
+#ifndef MPT_COMPILER_GCC
+#define MPT_COMPILER_GCC                      0
+#define MPT_GCC_AT_LEAST(major, minor, patch) 0
+#define MPT_GCC_BEFORE(major, minor, patch)   0
+#endif
+#ifndef MPT_COMPILER_MSVC
+#define MPT_COMPILER_MSVC              0
+#define MPT_MSVC_AT_LEAST(version, sp) 0
+#define MPT_MSVC_BEFORE(version, sp)   0
+#endif
+
+
+
+#if MPT_COMPILER_GENERIC || MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+
+#if (__cplusplus >= 201703)
+#define MPT_CXX 17
+#else
+#define MPT_CXX 17
+#endif
+
+#elif MPT_COMPILER_MSVC
+
+#if (_MSVC_LANG >= 201703)
+#define MPT_CXX 17
+#else
+#define MPT_CXX 17
+#endif
+
+#else
+
+#define MPT_CXX 17
+
+#endif
+
+// MPT_CXX is stricter than just using __cplusplus directly.
+// We will only claim a language version as supported IFF all core language and
+// library fatures that we need are actually supported AND working correctly
+// (to our needs).
+
+#define MPT_CXX_AT_LEAST(version) (MPT_CXX >= (version))
+#define MPT_CXX_BEFORE(version)   (MPT_CXX < (version))
+
+
+
+#endif // MPT_BASE_DETECT_COMPILER_HPP

Property changes on: src/mpt/base/detect_compiler.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_libc.hpp
===================================================================
--- src/mpt/base/detect_libc.hpp	(nonexistent)
+++ src/mpt/base/detect_libc.hpp	(working copy)
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_LIBC_HPP
+#define MPT_BASE_DETECT_LIBC_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+
+#include <cstddef>
+
+
+
+// order of checks is important!
+#if MPT_COMPILER_GENERIC
+#define MPT_LIBC_GENERIC 1
+#elif MPT_COMPILER_GCC && (defined(__MINGW32__) || defined(__MINGW64__))
+#define MPT_LIBC_MS 1
+#elif defined(__GNU_LIBRARY__)
+#define MPT_LIBC_GLIBC 1
+#elif MPT_COMPILER_MSVC
+#define MPT_LIBC_MS 1
+#elif MPT_COMPILER_CLANG && MPT_OS_WINDOWS
+#define MPT_LIBC_MS 1
+#else
+#define MPT_LIBC_GENERIC 1
+#endif
+
+#ifndef MPT_LIBC_GENERIC
+#define MPT_LIBC_GENERIC 0
+#endif
+#ifndef MPT_LIBC_GLIBC
+#define MPT_LIBC_GLIBC 0
+#endif
+#ifndef MPT_LIBC_MS
+#define MPT_LIBC_MS 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_LIBC_HPP

Property changes on: src/mpt/base/detect_libc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_libcxx.hpp
===================================================================
--- src/mpt/base/detect_libcxx.hpp	(nonexistent)
+++ src/mpt/base/detect_libcxx.hpp	(working copy)
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_LIBCXX_HPP
+#define MPT_BASE_DETECT_LIBCXX_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <version>
+#else // !C++20
+#include <array>
+#endif // C++20
+
+
+
+// order of checks is important!
+#if MPT_COMPILER_GENERIC
+#define MPT_LIBCXX_GENERIC 1
+#elif defined(_LIBCPP_VERSION)
+#define MPT_LIBCXX_LLVM 1
+#elif defined(__GLIBCXX__) || defined(__GLIBCPP__)
+#define MPT_LIBCXX_GNU 1
+#elif MPT_COMPILER_MSVC
+#define MPT_LIBCXX_MS 1
+#elif MPT_COMPILER_CLANG && MPT_OS_WINDOWS
+#define MPT_LIBCXX_MS 1
+#else
+#define MPT_LIBCXX_GENERIC 1
+#endif
+
+#ifndef MPT_LIBCXX_GENERIC
+#define MPT_LIBCXX_GENERIC 0
+#endif
+#ifndef MPT_LIBCXX_LLVM
+#define MPT_LIBCXX_LLVM 0
+#endif
+#ifndef MPT_LIBCXX_GNU
+#define MPT_LIBCXX_GNU 0
+#endif
+#ifndef MPT_LIBCXX_MS
+#define MPT_LIBCXX_MS 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_LIBCXX_HPP

Property changes on: src/mpt/base/detect_libcxx.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_os.hpp
===================================================================
--- src/mpt/base/detect_os.hpp	(nonexistent)
+++ src/mpt/base/detect_os.hpp	(working copy)
@@ -0,0 +1,109 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_OS_HPP
+#define MPT_BASE_DETECT_OS_HPP
+
+
+
+// The order of the checks matters!
+#if defined(__DJGPP__)
+#define MPT_OS_DJGPP 1
+#elif defined(__EMSCRIPTEN__)
+#define MPT_OS_EMSCRIPTEN 1
+#if defined(__EMSCRIPTEN_major__) && defined(__EMSCRIPTEN_minor__)
+#if (__EMSCRIPTEN_major__ > 1)
+// ok
+#elif (__EMSCRIPTEN_major__ == 1) && (__EMSCRIPTEN_minor__ > 39)
+// ok
+#elif (__EMSCRIPTEN_major__ == 1) && (__EMSCRIPTEN_minor__ == 39) && (__EMSCRIPTEN_tiny__ >= 7)
+// ok
+#else
+#error "Emscripten >= 1.39.7 is required."
+#endif
+#endif
+#elif defined(_WIN32)
+#define MPT_OS_WINDOWS 1
+#if defined(WINAPI_FAMILY)
+#include <winapifamily.h>
+#if (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
+#define MPT_OS_WINDOWS_WINRT 0
+#else
+#define MPT_OS_WINDOWS_WINRT 1
+#endif
+#else // !WINAPI_FAMILY
+#define MPT_OS_WINDOWS_WINRT 0
+#endif // WINAPI_FAMILY
+#elif defined(__APPLE__)
+#define MPT_OS_MACOSX_OR_IOS 1
+//#include "TargetConditionals.h"
+//#if TARGET_IPHONE_SIMULATOR
+//#elif TARGET_OS_IPHONE
+//#elif TARGET_OS_MAC
+//#else
+//#endif
+#elif defined(__HAIKU__)
+#define MPT_OS_HAIKU 1
+#elif defined(__ANDROID__) || defined(ANDROID)
+#define MPT_OS_ANDROID 1
+#elif defined(__linux__)
+#define MPT_OS_LINUX 1
+#elif defined(__DragonFly__)
+#define MPT_OS_DRAGONFLYBSD 1
+#elif defined(__FreeBSD__)
+#define MPT_OS_FREEBSD 1
+#elif defined(__OpenBSD__)
+#define MPT_OS_OPENBSD 1
+#elif defined(__NetBSD__)
+#define MPT_OS_NETBSD 1
+#elif defined(__unix__)
+#define MPT_OS_GENERIC_UNIX 1
+#else
+#define MPT_OS_UNKNOWN 1
+#endif
+
+#ifndef MPT_OS_DJGPP
+#define MPT_OS_DJGPP 0
+#endif
+#ifndef MPT_OS_EMSCRIPTEN
+#define MPT_OS_EMSCRIPTEN 0
+#endif
+#ifndef MPT_OS_WINDOWS
+#define MPT_OS_WINDOWS 0
+#endif
+#ifndef MPT_OS_WINDOWS_WINRT
+#define MPT_OS_WINDOWS_WINRT 0
+#endif
+#ifndef MPT_OS_MACOSX_OR_IOS
+#define MPT_OS_MACOSX_OR_IOS 0
+#endif
+#ifndef MPT_OS_HAIKU
+#define MPT_OS_HAIKU 0
+#endif
+#ifndef MPT_OS_ANDROID
+#define MPT_OS_ANDROID 0
+#endif
+#ifndef MPT_OS_LINUX
+#define MPT_OS_LINUX 0
+#endif
+#ifndef MPT_OS_DRAGONFLYBSD
+#define MPT_OS_DRAGONFLYBSD 0
+#endif
+#ifndef MPT_OS_FREEBSD
+#define MPT_OS_FREEBSD 0
+#endif
+#ifndef MPT_OS_OPENBSD
+#define MPT_OS_OPENBSD 0
+#endif
+#ifndef MPT_OS_NETBSD
+#define MPT_OS_NETBSD 0
+#endif
+#ifndef MPT_OS_GENERIC_UNIX
+#define MPT_OS_GENERIC_UNIX 0
+#endif
+#ifndef MPT_OS_UNKNOWN
+#define MPT_OS_UNKNOWN 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_OS.hpp

Property changes on: src/mpt/base/detect_os.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_quirks.hpp
===================================================================
--- src/mpt/base/detect_quirks.hpp	(nonexistent)
+++ src/mpt/base/detect_quirks.hpp	(working copy)
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_QUIRKS_HPP
+#define MPT_BASE_DETECT_QUIRKS_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+
+
+
+#if MPT_COMPILER_MSVC
+// Compiler has multiplication/division semantics when shifting signed integers.
+#define MPT_COMPILER_SHIFT_SIGNED 1
+#endif
+
+#ifndef MPT_COMPILER_SHIFT_SIGNED
+#define MPT_COMPILER_SHIFT_SIGNED 0
+#endif
+
+
+
+// This should really be based on __STDCPP_THREADS__, but that is not defined by
+// GCC or clang. Stupid.
+// Just assume multithreaded and disable for platforms we know are
+// singlethreaded later on.
+#define MPT_PLATFORM_MULTITHREADED 1
+
+#if MPT_OS_DJGPP
+#undef MPT_PLATFORM_MULTITHREADED
+#define MPT_PLATFORM_MULTITHREADED 0
+#endif
+
+#if (MPT_OS_EMSCRIPTEN && !defined(__EMSCRIPTEN_PTHREADS__))
+#undef MPT_PLATFORM_MULTITHREADED
+#define MPT_PLATFORM_MULTITHREADED 0
+#endif
+
+
+
+#if MPT_OS_EMSCRIPTEN && defined(MPT_BUILD_AUDIOWORKLETPROCESSOR)
+#define MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK
+#endif
+
+
+
+#if MPT_OS_EMSCRIPTEN && defined(MPT_BUILD_AUDIOWORKLETPROCESSOR)
+#define MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+#endif
+
+
+
+#if MPT_OS_DJGPP
+#define MPT_COMPILER_QUIRK_NO_WCHAR
+#endif
+
+
+
+#if defined(__arm__)
+
+#if defined(__SOFTFP__)
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 1
+#else
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+#if defined(__VFP_FP__)
+// native-endian IEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 0
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      0
+#elif defined(__MAVERICK__)
+// little-endian IEEE754, we assume native-endian though
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 1
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      0
+#else
+// not IEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 1
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      1
+#endif
+
+#elif defined(__mips__)
+
+#if defined(__mips_soft_float)
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 1
+#else
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+
+#endif
+
+#if MPT_OS_EMSCRIPTEN
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER64 1
+#endif
+
+#ifndef MPT_COMPILER_QUIRK_FLOAT_PREFER32
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER32 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_PREFER64
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER64 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_EMULATED
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_QUIRKS_HPP

Property changes on: src/mpt/base/detect_quirks.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/floatingpoint.hpp
===================================================================
--- src/mpt/base/floatingpoint.hpp	(nonexistent)
+++ src/mpt/base/floatingpoint.hpp	(working copy)
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_FLOATINGPOINT_HPP
+#define MPT_BASE_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// fp half
+// n/a
+
+// fp single
+using single = float;
+namespace float_literals {
+constexpr single operator"" _fs(long double lit) noexcept {
+	return static_cast<single>(lit);
+}
+} // namespace float_literals
+
+// fp double
+namespace float_literals {
+constexpr double operator"" _fd(long double lit) noexcept {
+	return static_cast<double>(lit);
+}
+} // namespace float_literals
+
+// fp extended
+namespace float_literals {
+constexpr long double operator"" _fe(long double lit) noexcept {
+	return static_cast<long double>(lit);
+}
+} // namespace float_literals
+
+// fp quad
+// n/a
+
+using float32 = std::conditional<sizeof(float) == 4, float, std::conditional<sizeof(double) == 4, double, std::conditional<sizeof(long double) == 4, long double, float>::type>::type>::type;
+namespace float_literals {
+constexpr float32 operator"" _f32(long double lit) noexcept {
+	return static_cast<float32>(lit);
+}
+} // namespace float_literals
+
+using float64 = std::conditional<sizeof(float) == 8, float, std::conditional<sizeof(double) == 8, double, std::conditional<sizeof(long double) == 8, long double, double>::type>::type>::type;
+namespace float_literals {
+constexpr float64 operator"" _f64(long double lit) noexcept {
+	return static_cast<float64>(lit);
+}
+} // namespace float_literals
+
+template <typename T>
+struct float_traits {
+	static constexpr bool is_float = !std::numeric_limits<T>::is_integer;
+	static constexpr bool is_hard = is_float && !MPT_COMPILER_QUIRK_FLOAT_EMULATED;
+	static constexpr bool is_soft = is_float && MPT_COMPILER_QUIRK_FLOAT_EMULATED;
+	static constexpr bool is_float32 = is_float && (sizeof(T) == 4);
+	static constexpr bool is_float64 = is_float && (sizeof(T) == 8);
+	static constexpr bool is_native_endian = is_float && !MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN;
+	static constexpr bool is_ieee754_binary = is_float && std::numeric_limits<T>::is_iec559 && !MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754;
+	static constexpr bool is_ieee754_binary32 = is_float && is_ieee754_binary && is_float32;
+	static constexpr bool is_ieee754_binary64 = is_float && is_ieee754_binary && is_float64;
+	static constexpr bool is_ieee754_binary32ne = is_float && is_ieee754_binary && is_float32 && is_native_endian;
+	static constexpr bool is_ieee754_binary64ne = is_float && is_ieee754_binary && is_float64 && is_native_endian;
+	static constexpr bool is_preferred = is_float && ((is_float32 && MPT_COMPILER_QUIRK_FLOAT_PREFER32) || (is_float64 && MPT_COMPILER_QUIRK_FLOAT_PREFER64));
+};
+
+// prefer smaller floats, but try to use IEEE754 floats
+using nativefloat =
+	std::conditional<mpt::float_traits<float32>::is_preferred, float32, std::conditional<mpt::float_traits<float64>::is_preferred, float64, std::conditional<std::numeric_limits<float>::is_iec559, float, std::conditional<std::numeric_limits<double>::is_iec559, double, std::conditional<std::numeric_limits<long double>::is_iec559, long double, float>::type>::type>::type>::type>::type;
+namespace float_literals {
+constexpr nativefloat operator"" _nf(long double lit) noexcept {
+	return static_cast<nativefloat>(lit);
+}
+} // namespace float_literals
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_FLOATINGPOINT_HPP

Property changes on: src/mpt/base/floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/integer.hpp
===================================================================
--- src/mpt/base/integer.hpp	(nonexistent)
+++ src/mpt/base/integer.hpp	(working copy)
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_INTEGER_HPP
+#define MPT_BASE_INTEGER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <cstdint>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+using int8 = std::int8_t;
+using int16 = std::int16_t;
+using int32 = std::int32_t;
+using int64 = std::int64_t;
+using uint8 = std::uint8_t;
+using uint16 = std::uint16_t;
+using uint32 = std::uint32_t;
+using uint64 = std::uint64_t;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_INTEGER_HPP

Property changes on: src/mpt/base/integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/macros.hpp
===================================================================
--- src/mpt/base/macros.hpp	(nonexistent)
+++ src/mpt/base/macros.hpp	(working copy)
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_MACROS_HPP
+#define MPT_BASE_MACROS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+
+#include <type_traits>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+// Advanced inline attributes
+#if MPT_COMPILER_MSVC
+#define MPT_FORCEINLINE __forceinline
+#define MPT_NOINLINE    __declspec(noinline)
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#define MPT_FORCEINLINE __attribute__((always_inline)) inline
+#define MPT_NOINLINE    __attribute__((noinline))
+#else
+#define MPT_FORCEINLINE inline
+#define MPT_NOINLINE
+#endif
+
+
+
+// constexpr
+#define MPT_CONSTEXPRINLINE constexpr MPT_FORCEINLINE
+#if MPT_CXX_AT_LEAST(20)
+#define MPT_CONSTEXPR20_FUN constexpr MPT_FORCEINLINE
+#define MPT_CONSTEXPR20_VAR constexpr
+#else // !C++20
+#define MPT_CONSTEXPR20_FUN MPT_FORCEINLINE
+#define MPT_CONSTEXPR20_VAR const
+#endif // C++20
+
+
+
+#define MPT_FORCE_CONSTEXPR(expr) [&]() { \
+	constexpr auto x = (expr); \
+	return x; \
+}()
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+#define MPT_IS_CONSTANT_EVALUATED20() std::is_constant_evaluated()
+#define MPT_IS_CONSTANT_EVALUATED()   std::is_constant_evaluated()
+#else // !C++20
+#define MPT_IS_CONSTANT_EVALUATED20() false
+// this pessimizes the case for C++17 by always assuming constexpr context, which implies always running constexpr-friendly code
+#define MPT_IS_CONSTANT_EVALUATED()   true
+#endif // C++20
+
+
+
+#if MPT_COMPILER_MSVC
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	__pragma(warning(push)) \
+	__pragma(warning(disable : 4127)) \
+	if (x) \
+		__pragma(warning(pop)) \
+/**/
+#endif
+
+#if MPT_COMPILER_GCC
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	_Pragma("GCC diagnostic push") \
+	_Pragma("GCC diagnostic ignored \"-Wtype-limits\"") \
+	if (x) \
+		_Pragma("GCC diagnostic pop") \
+/**/
+#endif
+
+#if MPT_COMPILER_CLANG
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	_Pragma("clang diagnostic push") \
+	_Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") \
+	_Pragma("clang diagnostic ignored \"-Wtype-limits\"") \
+	_Pragma("clang diagnostic ignored \"-Wtautological-constant-out-of-range-compare\"") \
+	if (x) \
+		_Pragma("clang diagnostic pop") \
+/**/
+#endif
+
+#if !defined(MPT_MAYBE_CONSTANT_IF)
+// MPT_MAYBE_CONSTANT_IF disables compiler warnings for conditions that may in some case be either always false or always true (this may turn out to be useful in ASSERTions in some cases).
+#define MPT_MAYBE_CONSTANT_IF(x) if (x)
+#endif
+
+
+
+#if MPT_OS_WINDOWS
+#define MPT_UNUSED(x) UNREFERENCED_PARAMETER(x)
+#else
+#define MPT_UNUSED(x) static_cast<void>(x)
+#endif
+
+
+
+#define MPT_DISCARD(expr) static_cast<void>(expr)
+
+
+
+// Use MPT_RESTRICT to indicate that a pointer is guaranteed to not be aliased.
+#if MPT_COMPILER_MSVC || MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#define MPT_RESTRICT __restrict
+#else
+#define MPT_RESTRICT
+#endif
+
+
+
+#endif // MPT_BASE_MACROS_HPP

Property changes on: src/mpt/base/macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/math.hpp
===================================================================
--- src/mpt/base/math.hpp	(nonexistent)
+++ src/mpt/base/math.hpp	(working copy)
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_EMPTY_HPP
+#define MPT_BASE_EMPTY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <cmath>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_OS_DJGPP
+
+inline double round(const long double val) {
+	return ::roundl(val);
+}
+
+inline double round(const double val) {
+	return ::round(val);
+}
+
+inline float round(const float val) {
+	return ::roundf(val);
+}
+
+#else // !MPT_OS_DJGPP
+
+// C++11 std::round
+using std::round;
+
+#endif // MPT_OS_DJGPP
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_EMPTY_HPP

Property changes on: src/mpt/base/math.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/memory.hpp
===================================================================
--- src/mpt/base/memory.hpp	(nonexistent)
+++ src/mpt/base/memory.hpp	(working copy)
@@ -0,0 +1,262 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_MEMORY_HPP
+#define MPT_BASE_MEMORY_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/span.hpp"
+
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+using byte_span = mpt::span<std::byte>;
+using const_byte_span = mpt::span<const std::byte>;
+
+
+
+// Tell which types are safe for mpt::byte_cast.
+// signed char is actually not allowed to alias into an object representation,
+// which means that, if the actual type is not itself signed char but char or
+// unsigned char instead, dereferencing the signed char pointer is undefined
+// behaviour.
+template <typename T>
+struct is_byte_castable : public std::false_type { };
+template <>
+struct is_byte_castable<char> : public std::true_type { };
+template <>
+struct is_byte_castable<unsigned char> : public std::true_type { };
+template <>
+struct is_byte_castable<std::byte> : public std::true_type { };
+template <>
+struct is_byte_castable<const char> : public std::true_type { };
+template <>
+struct is_byte_castable<const unsigned char> : public std::true_type { };
+template <>
+struct is_byte_castable<const std::byte> : public std::true_type { };
+
+
+template <typename T>
+struct is_byte : public std::false_type { };
+template <>
+struct is_byte<std::byte> : public std::true_type { };
+template <>
+struct is_byte<const std::byte> : public std::true_type { };
+
+
+template <typename T>
+constexpr bool declare_binary_safe(const T &) noexcept {
+	return false;
+}
+
+constexpr bool declare_binary_safe(const char &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8 &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8 &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const std::byte &) noexcept {
+	return true;
+}
+
+// Tell which types are safe to binary write into files.
+// By default, no types are safe.
+// When a safe type gets defined,
+// also specialize this template so that IO functions will work.
+template <typename T>
+struct is_binary_safe : public std::conditional<declare_binary_safe(T{}), std::true_type, std::false_type>::type { };
+
+// Generic Specialization for arrays.
+template <typename T, std::size_t N>
+struct is_binary_safe<T[N]> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<const T[N]> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<std::array<T, N>> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<const std::array<T, N>> : public is_binary_safe<T> { };
+
+
+template <typename T>
+constexpr bool check_binary_size(std::size_t size) noexcept {
+	return true
+		&& (sizeof(T) == size)
+		&& (alignof(T) == 1)
+		&& std::is_standard_layout<T>::value
+		&& std::has_unique_object_representations<T>::value
+		&& mpt::is_binary_safe<T>::value;
+}
+
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl {
+	inline Tdst operator()(Tsrc src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		// not checking is_byte_castable here because we are actually
+		// doing a static_cast and converting the value
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return static_cast<Tdst>(src);
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl<mpt::span<Tdst>, mpt::span<Tsrc>> {
+	inline mpt::span<Tdst> operator()(mpt::span<Tsrc> src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return mpt::as_span(mpt::byte_cast_impl<Tdst *, Tsrc *>()(src.data()), mpt::byte_cast_impl<Tdst *, Tsrc *>()(src.data() + src.size()));
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl<Tdst *, Tsrc *> {
+	inline Tdst * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct void_cast_impl;
+
+template <typename Tdst>
+struct void_cast_impl<Tdst *, void *> {
+	inline Tdst * operator()(void * src) const noexcept {
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tdst>
+struct void_cast_impl<Tdst *, const void *> {
+	inline Tdst * operator()(const void * src) const noexcept {
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tsrc>
+struct void_cast_impl<void *, Tsrc *> {
+	inline void * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		return reinterpret_cast<void *>(src);
+	}
+};
+
+template <typename Tsrc>
+struct void_cast_impl<const void *, Tsrc *> {
+	inline const void * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		return reinterpret_cast<const void *>(src);
+	}
+};
+
+// casts between different byte (char) types or pointers to these types
+template <typename Tdst, typename Tsrc>
+inline Tdst byte_cast(Tsrc src) noexcept {
+	return byte_cast_impl<Tdst, Tsrc>()(src);
+}
+
+// casts between pointers to void and pointers to byte
+template <typename Tdst, typename Tsrc>
+inline Tdst void_cast(Tsrc src) noexcept {
+	return void_cast_impl<Tdst, Tsrc>()(src);
+}
+
+
+
+template <typename T>
+MPT_CONSTEXPRINLINE std::byte as_byte(T src) noexcept {
+	static_assert(std::is_integral<T>::value);
+	return static_cast<std::byte>(static_cast<uint8>(src));
+}
+
+
+
+template <typename T>
+struct as_raw_memory_impl {
+	inline mpt::const_byte_span operator()(const T & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(&v), sizeof(T));
+	}
+	inline mpt::byte_span operator()(T & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(&v), sizeof(T));
+	}
+};
+
+template <typename T, std::size_t N>
+struct as_raw_memory_impl<T[N]> {
+	inline mpt::const_byte_span operator()(const T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v), N * sizeof(T));
+	}
+	inline mpt::byte_span operator()(T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(v), N * sizeof(T));
+	}
+};
+
+template <typename T, std::size_t N>
+struct as_raw_memory_impl<const T[N]> {
+	inline mpt::const_byte_span operator()(const T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v), N * sizeof(T));
+	}
+};
+
+// In order to be able to partially specialize it,
+// as_raw_memory is implemented via a class template.
+// Do not overload or specialize as_raw_memory directly.
+// Using a wrapper (by default just around a cast to const std::byte *),
+// allows for implementing raw memory access
+// via on-demand generating a cached serialized representation.
+template <typename T>
+inline mpt::const_byte_span as_raw_memory(const T & v) {
+	return mpt::as_raw_memory_impl<T>()(v);
+}
+template <typename T>
+inline mpt::byte_span as_raw_memory(T & v) {
+	return mpt::as_raw_memory_impl<T>()(v);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_MEMORY_HPP

Property changes on: src/mpt/base/memory.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/namespace.hpp
===================================================================
--- src/mpt/base/namespace.hpp	(nonexistent)
+++ src/mpt/base/namespace.hpp	(working copy)
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_NAMESPACE_HPP
+#define MPT_BASE_NAMESPACE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/version.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+
+
+#if !defined(MPT_INLINE_NS)
+
+#define MPT_BUILD_VERSION_NAMESPACE_IMPL(a, b, c, d) v##a##_##b##_##c##_##d
+#define MPT_BUILD_VERSION_NAMESPACE(a, b, c, d)      MPT_BUILD_VERSION_NAMESPACE_IMPL(a, b, c, d)
+
+#define MPT_VERSION_NAMESPACE MPT_BUILD_VERSION_NAMESPACE(MPT_VERSION_MAJOR, MPT_VERSION_MINOR, MPT_VERSION_PATCH, MPT_VERSION_BUILD)
+
+#if MPT_OS_WINDOWS
+#ifdef UNICODE
+#define MPT_VERSION_ABI_OS u
+#else
+#define MPT_VERSION_ABI_OS 8
+#endif
+#else
+#define MPT_VERSION_ABI_OS _
+#endif
+
+#if MPT_LIBC_GENERIC
+#define MPT_VERSION_ABI_LIBC _
+#elif MPT_LIBC_MS
+#ifdef _DLL
+#ifdef _DEBUG
+#define MPT_VERSION_ABI_LIBC MDd
+#else
+#define MPT_VERSION_ABI_LIBC MDr
+#endif
+#else
+#ifdef _DEBUG
+#define MPT_VERSION_ABI_LIBC MTd
+#else
+#define MPT_VERSION_ABI_LIBC MTr
+#endif
+#endif
+#elif MPT_LIBC_GLIBC
+#define MPT_VERSION_ABI_LIBC G
+#else
+#define MPT_VERSION_ABI_LIBC _
+#endif
+
+#define MPT_BUILD_ABI_NAMESPACE_IMPL(a, b) ABI_##a##_##b
+#define MPT_BUILD_ABI_NAMESPACE(a, b)      MPT_BUILD_ABI_NAMESPACE_IMPL(a, b)
+
+#define MPT_ABI_NAMESPACE MPT_BUILD_ABI_NAMESPACE(MPT_VERSION_ABI_OS, MPT_VERSION_ABI_LIBC)
+
+#if !defined(MPT_PROJECT_NAMESPACE)
+MPT_WARNING("Please #define MPT_PROJECT_NAMESPACE or #define MPT_INLINE_NS in build configuration.")
+#define MPT_PROJECT_NAMESPACE x
+#endif // !MPT_PROJECT_NAMESPACE
+
+#define MPT_BUILD_INLINE_NS_IMPL(a, b, c) a##_##b##_##c
+#define MPT_BUILD_INLINE_NS(a, b, c)      MPT_BUILD_INLINE_NS_IMPL(a, b, c)
+
+#define MPT_INLINE_NS MPT_BUILD_INLINE_NS(MPT_VERSION_NAMESPACE, MPT_ABI_NAMESPACE, MPT_PROJECT_NAMESPACE)
+
+#endif // !MPT_INLINE_NS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_NAMESPACE_HPP

Property changes on: src/mpt/base/namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/numeric.hpp
===================================================================
--- src/mpt/base/numeric.hpp	(nonexistent)
+++ src/mpt/base/numeric.hpp	(working copy)
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_NUMERIC_HPP
+#define MPT_BASE_NUMERIC_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/saturate_cast.hpp"
+
+#include <algorithm>
+#include <limits>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tmod, Tmod m>
+struct ModIfNotZeroImpl {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		static_assert(std::numeric_limits<Tmod>::is_integer);
+		static_assert(!std::numeric_limits<Tmod>::is_signed);
+		static_assert(std::numeric_limits<Tval>::is_integer);
+		static_assert(!std::numeric_limits<Tval>::is_signed);
+		return static_cast<Tval>(x % m);
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint8, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint16, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint32, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint64, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+
+// Returns x % m if m != 0, x otherwise.
+// i.e. "return (m == 0) ? x : (x % m);", but without causing a warning with stupid older compilers
+template <typename Tmod, Tmod m, typename Tval>
+constexpr Tval modulo_if_not_zero(Tval x) {
+	return ModIfNotZeroImpl<Tmod, m>().mod(x);
+}
+
+// rounds x up to multiples of target
+template <typename T>
+constexpr T align_up(T x, T target) {
+	return ((x + (target - 1)) / target) * target;
+}
+
+// rounds x down to multiples of target
+template <typename T>
+constexpr T align_down(T x, T target) {
+	return (x / target) * target;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALGORITHM_HPP

Property changes on: src/mpt/base/numeric.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/pointer.hpp
===================================================================
--- src/mpt/base/pointer.hpp	(nonexistent)
+++ src/mpt/base/pointer.hpp	(working copy)
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_POINTER_HPP
+#define MPT_BASE_POINTER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+inline constexpr int arch_bits = sizeof(void *) * 8;
+inline constexpr std::size_t pointer_size = sizeof(void *);
+
+
+template <typename Tdst, typename Tsrc>
+struct pointer_cast_helper {
+	static constexpr Tdst cast(const Tsrc & src) noexcept {
+		return src;
+	}
+};
+
+template <typename Tdst, typename Tptr>
+struct pointer_cast_helper<Tdst, const Tptr *> {
+	static constexpr Tdst cast(const Tptr * const & src) noexcept {
+		return reinterpret_cast<const Tdst>(src);
+	}
+};
+template <typename Tdst, typename Tptr>
+struct pointer_cast_helper<Tdst, Tptr *> {
+	static constexpr Tdst cast(const Tptr * const & src) noexcept {
+		return reinterpret_cast<const Tdst>(src);
+	}
+};
+
+
+template <typename Tdst, typename Tsrc>
+constexpr Tdst pointer_cast(const Tsrc & src) noexcept {
+	return pointer_cast_helper<Tdst, Tsrc>::cast(src);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_POINTER_HPP

Property changes on: src/mpt/base/pointer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/preprocessor.hpp
===================================================================
--- src/mpt/base/preprocessor.hpp	(nonexistent)
+++ src/mpt/base/preprocessor.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_PREPROCESSOR_HPP
+#define MPT_BASE_PREPROCESSOR_HPP
+
+
+
+#define MPT_PP_DEFER(m, ...) m(__VA_ARGS__)
+
+#define MPT_PP_STRINGIFY(x) #x
+
+#define MPT_PP_JOIN_HELPER(a, b) a##b
+#define MPT_PP_JOIN(a, b)        MPT_PP_JOIN_HELPER(a, b)
+
+#define MPT_PP_UNIQUE_IDENTIFIER(prefix) MPT_PP_JOIN(prefix, __LINE__)
+
+
+
+#endif // MPT_BASE_PREPROCESSOR_HPP

Property changes on: src/mpt/base/preprocessor.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/saturate_cast.hpp
===================================================================
--- src/mpt/base/saturate_cast.hpp	(nonexistent)
+++ src/mpt/base/saturate_cast.hpp	(working copy)
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SATURATE_CAST_HPP
+#define MPT_BASE_SATURATE_CAST_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Saturate the value of src to the domain of Tdst
+template <typename Tdst, typename Tsrc>
+constexpr Tdst saturate_cast(Tsrc src) noexcept {
+	// This code tries not only to obviously avoid overflows but also to avoid signed/unsigned comparison warnings and type truncation warnings (which in fact would be safe here) by explicit casting.
+	static_assert(std::numeric_limits<Tdst>::is_integer);
+	static_assert(std::numeric_limits<Tsrc>::is_integer);
+	if constexpr (std::numeric_limits<Tdst>::is_signed && std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(std::numeric_limits<Tdst>::min()), std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))));
+		}
+	} else if constexpr (!std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		}
+	} else if constexpr (std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) > sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else if constexpr (sizeof(Tdst) == sizeof(Tsrc)) {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		} else {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		}
+	} else { // Tdst unsigned, Tsrc signed
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(0), src));
+		} else {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(0), std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))));
+		}
+	}
+}
+
+template <typename Tdst>
+constexpr Tdst saturate_cast(double src) {
+	if (src >= static_cast<double>(std::numeric_limits<Tdst>::max())) {
+		return std::numeric_limits<Tdst>::max();
+	}
+	if (src <= static_cast<double>(std::numeric_limits<Tdst>::min())) {
+		return std::numeric_limits<Tdst>::min();
+	}
+	return static_cast<Tdst>(src);
+}
+
+template <typename Tdst>
+constexpr Tdst saturate_cast(float src) {
+	if (src >= static_cast<float>(std::numeric_limits<Tdst>::max())) {
+		return std::numeric_limits<Tdst>::max();
+	}
+	if (src <= static_cast<float>(std::numeric_limits<Tdst>::min())) {
+		return std::numeric_limits<Tdst>::min();
+	}
+	return static_cast<Tdst>(src);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SATURATE_CAST_HPP

Property changes on: src/mpt/base/saturate_cast.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/saturate_round.hpp
===================================================================
--- src/mpt/base/saturate_round.hpp	(nonexistent)
+++ src/mpt/base/saturate_round.hpp	(working copy)
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SATURATE_ROUND_HPP
+#define MPT_BASE_SATURATE_ROUND_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/math.hpp"
+#include "mpt/base/saturate_cast.hpp"
+
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Rounds given double value to nearest integer value of type T.
+// Out-of-range values are saturated to the specified integer type's limits.
+
+template <typename T>
+inline T saturate_round(float val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+template <typename T>
+inline T saturate_round(double val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+template <typename T>
+inline T saturate_round(long double val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SATURATE_ROUND_HPP

Property changes on: src/mpt/base/saturate_round.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/secure.hpp
===================================================================
--- src/mpt/base/secure.hpp	(nonexistent)
+++ src/mpt/base/secure.hpp	(working copy)
@@ -0,0 +1,198 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SECURE_HPP
+#define MPT_BASE_SECURE_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <atomic>
+#include <utility>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace secure {
+
+
+
+inline MPT_NOINLINE void memzero(std::byte * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = static_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(void * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = static_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(char * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = reinterpret_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(uint8 * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = reinterpret_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+
+
+template <typename T>
+inline MPT_NOINLINE void clear(T & val) {
+	std::atomic_signal_fence(std::memory_order_seq_cst);
+	volatile T * volatile v = &val;
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	*v = T{};
+	std::atomic_signal_fence(std::memory_order_seq_cst);
+}
+
+
+
+class byte {
+private:
+	std::byte value;
+
+public:
+	byte() noexcept
+		: value(std::byte{0}) {
+		return;
+	}
+	explicit byte(std::byte value) noexcept
+		: value(value) {
+		return;
+	}
+	byte(const byte & other) noexcept
+		: value(other.value) {
+		return;
+	}
+	byte(byte && other) noexcept
+		: value(std::move(other.value)) {
+		mpt::secure::clear(other.value);
+	}
+	byte & operator=(const byte & other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		value = other.value;
+		return *this;
+	}
+	byte & operator==(byte && other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		value = std::move(other.value);
+		mpt::secure::clear(other.value);
+		return *this;
+	}
+	explicit operator std::byte() const noexcept {
+		return value;
+	}
+	~byte() {
+		mpt::secure::clear(value);
+	}
+};
+
+
+
+class buffer {
+private:
+	std::vector<std::byte> m_data;
+
+public:
+	buffer()
+		: m_data(0) {
+		return;
+	}
+	explicit buffer(const std::vector<std::byte> & data)
+		: m_data(data) {
+		return;
+	}
+	explicit buffer(const std::byte * beg, const std::byte * end)
+		: m_data(beg, end) {
+		return;
+	}
+	buffer(const buffer & other)
+		: m_data(other.m_data) {
+		return;
+	}
+	buffer(buffer && other) noexcept
+		: m_data(std::move(other.m_data)) {
+		mpt::secure::memzero(other.m_data.data(), other.m_data.size());
+	}
+	buffer & operator=(const buffer & other) {
+		if (&other == this) {
+			return *this;
+		}
+		m_data = other.m_data;
+		return *this;
+	}
+	buffer & operator=(buffer && other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		m_data = std::move(other.m_data);
+		mpt::secure::memzero(other.m_data.data(), other.m_data.size());
+		return *this;
+	}
+	~buffer() {
+		mpt::secure::memzero(m_data.data(), m_data.size());
+		m_data.resize(0);
+		m_data.shrink_to_fit();
+	}
+	explicit operator std::vector<std::byte>() const {
+		return m_data;
+	}
+	const std::byte * data() const {
+		return m_data.data();
+	}
+	std::byte * data() {
+		return m_data.data();
+	}
+	std::size_t size() const {
+		return m_data.size();
+	}
+};
+
+
+
+} // namespace secure
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SECURE_HPP

Property changes on: src/mpt/base/secure.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/semantic_version.hpp
===================================================================
--- src/mpt/base/semantic_version.hpp	(nonexistent)
+++ src/mpt/base/semantic_version.hpp	(working copy)
@@ -0,0 +1,94 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SEMANTIC_VERSION_HPP
+#define MPT_BASE_SEMANTIC_VERSION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/version.hpp"
+
+
+
+#include <tuple>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+struct semantic_version {
+	unsigned long long major = 0;
+	unsigned long long minor = 0;
+	unsigned long long patch = 0;
+	constexpr std::tuple<unsigned long long, unsigned long long, unsigned long long> as_tuple() const noexcept {
+		return std::make_tuple(major, minor, patch);
+	}
+};
+
+constexpr bool operator==(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() == b.as_tuple();
+}
+constexpr bool operator!=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() != b.as_tuple();
+}
+constexpr bool operator<(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() < b.as_tuple();
+}
+constexpr bool operator>(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() > b.as_tuple();
+}
+constexpr bool operator<=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() <= b.as_tuple();
+}
+constexpr bool operator>=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() >= b.as_tuple();
+}
+
+struct version_info {
+	semantic_version semver{};
+	unsigned long long build = 0;
+	constexpr std::tuple<std::tuple<unsigned long long, unsigned long long, unsigned long long>, unsigned long long> as_tuple() const noexcept {
+		return std::make_tuple(semver.as_tuple(), build);
+	}
+	template <typename Tostream>
+	friend Tostream & operator<<(Tostream & os, version_info const vi) {
+		if (vi.build > 0) {
+			os << vi.semver.major << "." << vi.semver.minor << "." << vi.semver.patch << "+build." << vi.build;
+		} else {
+			os << vi.semver.major << "." << vi.semver.minor << "." << vi.semver.patch;
+		}
+		return os;
+	}
+};
+
+constexpr bool operator==(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() == b.as_tuple();
+}
+constexpr bool operator!=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() != b.as_tuple();
+}
+constexpr bool operator<(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() < b.as_tuple();
+}
+constexpr bool operator>(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() > b.as_tuple();
+}
+constexpr bool operator<=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() <= b.as_tuple();
+}
+constexpr bool operator>=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() >= b.as_tuple();
+}
+
+constexpr inline version_info Version = {{MPT_VERSION_MAJOR, MPT_VERSION_MINOR, MPT_VERSION_PATCH}, MPT_VERSION_BUILD};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SEMANTIC_VERSION_HPP

Property changes on: src/mpt/base/semantic_version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/source_location.hpp
===================================================================
--- src/mpt/base/source_location.hpp	(nonexistent)
+++ src/mpt/base/source_location.hpp	(working copy)
@@ -0,0 +1,115 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SOURCE_LOCATION_HPP
+#define MPT_BASE_SOURCE_LOCATION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <source_location>
+#endif // C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::source_location;
+
+#define MPT_SOURCE_LOCATION_CURRENT() std::source_location::current()
+
+#else // !C++20
+
+#if MPT_COMPILER_MSVC && MPT_MSVC_AT_LEAST(2019, 6)
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   __builtin_COLUMN()
+
+#elif MPT_COMPILER_GCC
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   0
+
+#elif MPT_COMPILER_CLANG && MPT_CLANG_AT_LEAST(9, 0, 0)
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   __builtin_COLUMN()
+
+#else
+
+#define MPT_SOURCE_LOCATION_FILE     __FILE__
+#define MPT_SOURCE_LOCATION_FUNCTION ""
+#define MPT_SOURCE_LOCATION_LINE     __LINE__
+#define MPT_SOURCE_LOCATION_COLUMN   0
+
+#endif
+
+// compatible with C++20 std::source_location
+struct source_location {
+private:
+	const char * m_file_name;
+	const char * m_function_name;
+	uint32 m_line;
+	uint32 m_column;
+
+public:
+	constexpr source_location() noexcept
+		: m_file_name("")
+		, m_function_name("")
+		, m_line(0)
+		, m_column(0) {
+	}
+	constexpr source_location(const char * file, const char * function, uint32 line, uint32 column) noexcept
+		: m_file_name(file)
+		, m_function_name(function)
+		, m_line(line)
+		, m_column(column) {
+	}
+	source_location(const source_location &) = default;
+	source_location(source_location &&) = default;
+	static constexpr source_location current(const char * file = MPT_SOURCE_LOCATION_FILE, const char * function = MPT_SOURCE_LOCATION_FUNCTION, uint32 line = MPT_SOURCE_LOCATION_LINE, uint32 column = MPT_SOURCE_LOCATION_COLUMN) noexcept {
+		return source_location(file, function, line, column);
+	}
+	constexpr uint32 line() const noexcept {
+		return m_line;
+	}
+	constexpr uint32 column() const noexcept {
+		return m_column;
+	}
+	constexpr const char * file_name() const noexcept {
+		return m_file_name;
+	}
+	constexpr const char * function_name() const noexcept {
+		return m_function_name;
+	}
+};
+
+
+#if (MPT_COMPILER_MSVC && MPT_MSVC_AT_LEAST(2019, 6)) || MPT_COMPILER_GCC || (MPT_COMPILER_CLANG && MPT_CLANG_AT_LEAST(9, 0, 0))
+#define MPT_SOURCE_LOCATION_CURRENT() mpt::source_location::current()
+#else
+#define MPT_SOURCE_LOCATION_CURRENT() mpt::source_location::current(__FILE__, __func__, __LINE__, 0)
+#endif
+
+#endif // C++20
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SOURCE_LOCATION_HPP

Property changes on: src/mpt/base/source_location.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/span.hpp
===================================================================
--- src/mpt/base/span.hpp	(nonexistent)
+++ src/mpt/base/span.hpp	(working copy)
@@ -0,0 +1,213 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SPAN_HPP
+#define MPT_BASE_SPAN_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#if MPT_CXX_AT_LEAST(20)
+#include <span>
+#else // !C++20
+#include <iterator>
+#include <limits>
+#include <type_traits>
+#endif // C++20
+
+#if MPT_CXX_BEFORE(20)
+#include <cstddef>
+#endif // !C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::dynamic_extent;
+using std::span;
+
+#else // !C++20
+
+//  Simplified version of gsl::span.
+//  Non-owning read-only or read-write view into a contiguous block of T
+// objects, i.e. equivalent to a (beg,end) or (data,size) tuple.
+//  Can eventually be replaced without further modifications with a full C++20
+// std::span.
+
+inline constexpr std::size_t dynamic_extent = std::numeric_limits<std::size_t>::max();
+
+template <typename T>
+class span {
+
+public:
+	using element_type = T;
+	using value_type = typename std::remove_cv<T>::type;
+	using index_type = std::size_t;
+	using pointer = T *;
+	using const_pointer = const T *;
+	using reference = T &;
+	using const_reference = const T &;
+
+	using iterator = pointer;
+	using const_iterator = const_pointer;
+
+	using difference_type = typename std::iterator_traits<iterator>::difference_type;
+
+private:
+	T * m_beg;
+	T * m_end;
+
+public:
+	span() noexcept
+		: m_beg(nullptr)
+		, m_end(nullptr) {
+	}
+
+	span(pointer beg, pointer end)
+		: m_beg(beg)
+		, m_end(end) {
+	}
+
+	span(pointer data, index_type size)
+		: m_beg(data)
+		, m_end(data + size) {
+	}
+
+	template <std::size_t N>
+	span(element_type (&arr)[N])
+		: m_beg(arr)
+		, m_end(arr + N) {
+	}
+
+	template <std::size_t N>
+	span(std::array<value_type, N> & arr)
+		: m_beg(arr.data())
+		, m_end(arr.data() + arr.size()) {
+	}
+
+	template <std::size_t N>
+	span(const std::array<value_type, N> & arr)
+		: m_beg(arr.data())
+		, m_end(arr.data() + arr.size()) {
+	}
+
+	span(const span & other) noexcept = default;
+
+	template <typename U>
+	span(const span<U> & other)
+		: m_beg(other.begin())
+		, m_end(other.end()) {
+	}
+
+	span & operator=(const span & other) noexcept = default;
+
+	iterator begin() const {
+		return iterator(m_beg);
+	}
+
+	iterator end() const {
+		return iterator(m_end);
+	}
+
+	const_iterator cbegin() const {
+		return const_iterator(begin());
+	}
+
+	const_iterator cend() const {
+		return const_iterator(end());
+	}
+
+	reference operator[](index_type index) {
+		return at(index);
+	}
+
+	const_reference operator[](index_type index) const {
+		return at(index);
+	}
+
+	bool operator==(span const & other) const noexcept {
+		return size() == other.size() && (m_beg == other.m_beg || std::equal(begin(), end(), other.begin()));
+	}
+
+	bool operator!=(span const & other) const noexcept {
+		return !(*this == other);
+	}
+
+	reference at(index_type index) {
+		return m_beg[index];
+	}
+
+	const_reference at(index_type index) const {
+		return m_beg[index];
+	}
+
+	pointer data() const noexcept {
+		return m_beg;
+	}
+
+	bool empty() const noexcept {
+		return size() == 0;
+	}
+
+	index_type size() const noexcept {
+		return static_cast<index_type>(std::distance(m_beg, m_end));
+	}
+
+	index_type length() const noexcept {
+		return size();
+	}
+
+	span subspan(std::size_t offset, std::size_t count = mpt::dynamic_extent) const {
+		return span(data() + offset, (count == mpt::dynamic_extent) ? (size() - offset) : count);
+	}
+
+	span first(std::size_t count) const {
+		return span(data(), count);
+	}
+
+	span last(std::size_t count) const {
+		return span(data() + (size() - count), count);
+	}
+
+}; // class span
+
+#endif // C++20
+
+template <typename T>
+inline span<T> as_span(T * beg, T * end) {
+	return span<T>(beg, end);
+}
+
+template <typename T>
+inline span<T> as_span(T * data, std::size_t size) {
+	return span<T>(data, size);
+}
+
+template <typename T, std::size_t N>
+inline span<T> as_span(T (&arr)[N]) {
+	return span<T>(std::begin(arr), std::end(arr));
+}
+
+template <typename T, std::size_t N>
+inline span<T> as_span(std::array<T, N> & cont) {
+	return span<T>(cont);
+}
+
+template <typename T, std::size_t N>
+inline span<const T> as_span(const std::array<T, N> & cont) {
+	return span<const T>(cont);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SPAN_HPP

Property changes on: src/mpt/base/span.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_arithmetic_shift.hpp
===================================================================
--- src/mpt/base/tests/tests_base_arithmetic_shift.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_arithmetic_shift.hpp	(working copy)
@@ -0,0 +1,314 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP
+#define MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP
+
+
+
+#include "mpt/base/arithmetic_shift.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_arithmetic_shift{
+	"mpt/base/arithmetic_shift",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 1), mpt::rshift_signed_standard<int16>(-32768, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 1), mpt::rshift_signed_standard<int16>(-32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 1), mpt::rshift_signed_standard<int16>(-32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 1), mpt::rshift_signed_standard<int16>(-2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 1), mpt::rshift_signed_standard<int16>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 1), mpt::rshift_signed_standard<int16>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 1), mpt::rshift_signed_standard<int16>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 1), mpt::rshift_signed_standard<int16>(2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 1), mpt::rshift_signed_standard<int16>(32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 1), mpt::rshift_signed_standard<int16>(32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 14), mpt::rshift_signed_standard<int16>(-32768, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 14), mpt::rshift_signed_standard<int16>(-32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 14), mpt::rshift_signed_standard<int16>(-32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 14), mpt::rshift_signed_standard<int16>(-2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 14), mpt::rshift_signed_standard<int16>(-1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 14), mpt::rshift_signed_standard<int16>(0, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 14), mpt::rshift_signed_standard<int16>(1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 14), mpt::rshift_signed_standard<int16>(2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 14), mpt::rshift_signed_standard<int16>(32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 14), mpt::rshift_signed_standard<int16>(32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 15), mpt::rshift_signed_standard<int16>(-32768, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 15), mpt::rshift_signed_standard<int16>(-32767, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 15), mpt::rshift_signed_standard<int16>(-32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 15), mpt::rshift_signed_standard<int16>(-2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 15), mpt::rshift_signed_standard<int16>(-1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 15), mpt::rshift_signed_standard<int16>(0, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 15), mpt::rshift_signed_standard<int16>(1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 15), mpt::rshift_signed_standard<int16>(2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 15), mpt::rshift_signed_standard<int16>(32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 15), mpt::rshift_signed_standard<int16>(32767, 15));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 1), mpt::lshift_signed_standard<int16>(-32768, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 1), mpt::lshift_signed_standard<int16>(-32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 1), mpt::lshift_signed_standard<int16>(-32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 1), mpt::lshift_signed_standard<int16>(-2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 1), mpt::lshift_signed_standard<int16>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 1), mpt::lshift_signed_standard<int16>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 1), mpt::lshift_signed_standard<int16>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 1), mpt::lshift_signed_standard<int16>(2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 1), mpt::lshift_signed_standard<int16>(32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 1), mpt::lshift_signed_standard<int16>(32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 14), mpt::lshift_signed_standard<int16>(-32768, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 14), mpt::lshift_signed_standard<int16>(-32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 14), mpt::lshift_signed_standard<int16>(-32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 14), mpt::lshift_signed_standard<int16>(-2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 14), mpt::lshift_signed_standard<int16>(-1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 14), mpt::lshift_signed_standard<int16>(0, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 14), mpt::lshift_signed_standard<int16>(1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 14), mpt::lshift_signed_standard<int16>(2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 14), mpt::lshift_signed_standard<int16>(32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 14), mpt::lshift_signed_standard<int16>(32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 15), mpt::lshift_signed_standard<int16>(-32768, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 15), mpt::lshift_signed_standard<int16>(-32767, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 15), mpt::lshift_signed_standard<int16>(-32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 15), mpt::lshift_signed_standard<int16>(-2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 15), mpt::lshift_signed_standard<int16>(-1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 15), mpt::lshift_signed_standard<int16>(0, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 15), mpt::lshift_signed_standard<int16>(1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 15), mpt::lshift_signed_standard<int16>(2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 15), mpt::lshift_signed_standard<int16>(32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 15), mpt::lshift_signed_standard<int16>(32767, 15));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 1), (-32768) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 1), (-32767) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 1), (-32766) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 1), (-2) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 1), (-1) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 1), (0) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 1), (1) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 1), (2) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 1), (32766) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 1), (32767) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 14), (-32768) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 14), (-32767) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 14), (-32766) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 14), (-2) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 14), (-1) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 14), (0) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 14), (1) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 14), (2) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 14), (32766) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 14), (32767) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 15), (-32768) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 15), (-32767) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 15), (-32766) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 15), (-2) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 15), (-1) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 15), (0) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 15), (1) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 15), (2) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 15), (32766) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 15), (32767) >> 15);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 1), (-32768) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 1), (-32767) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 1), (-32766) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 1), (-2) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 1), (-1) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 1), (0) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 1), (1) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 1), (2) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 1), (32766) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 1), (32767) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 14), (-32768) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 14), (-32767) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 14), (-32766) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 14), (-2) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 14), (-1) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 14), (0) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 14), (1) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 14), (2) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 14), (32766) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 14), (32767) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 15), (-32768) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 15), (-32767) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 15), (-32766) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 15), (-2) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 15), (-1) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 15), (0) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 15), (1) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 15), (2) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 15), (32766) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 15), (32767) << 15);
+
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 1), mpt::rshift_signed_standard<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 1), mpt::rshift_signed_standard<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 1), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 1), mpt::rshift_signed_standard<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 1), mpt::rshift_signed_standard<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 1), mpt::rshift_signed_standard<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 1), mpt::rshift_signed_standard<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 1), mpt::rshift_signed_standard<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 31), mpt::rshift_signed_standard<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_standard<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 31), mpt::rshift_signed_standard<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 31), mpt::rshift_signed_standard<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 31), mpt::rshift_signed_standard<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 31), mpt::rshift_signed_standard<int32>(0x7fffffff, 31));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 1), mpt::lshift_signed_standard<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 1), mpt::lshift_signed_standard<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 1), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 1), mpt::lshift_signed_standard<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 1), mpt::lshift_signed_standard<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 1), mpt::lshift_signed_standard<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 1), mpt::lshift_signed_standard<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 1), mpt::lshift_signed_standard<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 31), mpt::lshift_signed_standard<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_standard<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 31), mpt::lshift_signed_standard<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 31), mpt::lshift_signed_standard<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 31), mpt::lshift_signed_standard<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 31), mpt::lshift_signed_standard<int32>(0x7fffffff, 31));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 1), mpt::rshift_signed_undefined<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 1), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 1), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 1), mpt::rshift_signed_undefined<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 1), mpt::rshift_signed_undefined<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 1), mpt::rshift_signed_undefined<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 1), mpt::rshift_signed_undefined<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 1), mpt::rshift_signed_undefined<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 31), mpt::rshift_signed_undefined<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 31), mpt::rshift_signed_undefined<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 31), mpt::rshift_signed_undefined<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 31), mpt::rshift_signed_undefined<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(0x7fffffff, 31));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 1), mpt::lshift_signed_undefined<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 1), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 1), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 1), mpt::lshift_signed_undefined<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 1), mpt::lshift_signed_undefined<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 1), mpt::lshift_signed_undefined<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 1), mpt::lshift_signed_undefined<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 1), mpt::lshift_signed_undefined<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 31), mpt::lshift_signed_undefined<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 31), mpt::lshift_signed_undefined<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 31), mpt::lshift_signed_undefined<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 31), mpt::lshift_signed_undefined<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(0x7fffffff, 31));
+
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::rshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 1), mpt::rshift_signed_standard<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 1), mpt::rshift_signed_standard<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 1), mpt::rshift_signed_standard<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::rshift_signed_standard<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::rshift_signed_standard<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::rshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 63), mpt::rshift_signed_standard<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 63), mpt::rshift_signed_standard<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 63), mpt::rshift_signed_standard<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(0x7fffffffffffffffll, 63));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::lshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 1), mpt::lshift_signed_standard<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 1), mpt::lshift_signed_standard<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 1), mpt::lshift_signed_standard<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::lshift_signed_standard<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::lshift_signed_standard<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::lshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 63), mpt::lshift_signed_standard<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 63), mpt::lshift_signed_standard<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 63), mpt::lshift_signed_standard<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(0x7fffffffffffffffll, 63));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::rshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 1), mpt::rshift_signed_undefined<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 1), mpt::rshift_signed_undefined<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 1), mpt::rshift_signed_undefined<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::rshift_signed_undefined<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::rshift_signed_undefined<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::rshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 63), mpt::rshift_signed_undefined<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 63), mpt::rshift_signed_undefined<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 63), mpt::rshift_signed_undefined<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(0x7fffffffffffffffll, 63));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::lshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 1), mpt::lshift_signed_undefined<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 1), mpt::lshift_signed_undefined<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 1), mpt::lshift_signed_undefined<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::lshift_signed_undefined<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::lshift_signed_undefined<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::lshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 63), mpt::lshift_signed_undefined<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 63), mpt::lshift_signed_undefined<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 63), mpt::lshift_signed_undefined<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(0x7fffffffffffffffll, 63));
+
+#endif
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP

Property changes on: src/mpt/base/tests/tests_base_arithmetic_shift.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_bit.hpp
===================================================================
--- src/mpt/base/tests/tests_base_bit.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_bit.hpp	(working copy)
@@ -0,0 +1,214 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_BASE_BIT_HPP
+#define MPT_BASE_TESTS_BASE_BIT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_bit{
+	"mpt/base/bit",
+	[](mpt::test::context & context) {
+
+#if MPT_CXX_BEFORE(20)
+		MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian_probe());
+#endif
+		MPT_MAYBE_CONSTANT_IF(mpt::endian_is_little()) {
+			MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::little);
+			MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+				MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::little);
+			}
+#if MPT_CXX_BEFORE(20)
+			MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::little);
+#endif
+		}
+		MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big()) {
+			MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::big);
+			MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+				MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::big);
+			}
+#if MPT_CXX_BEFORE(20)
+			MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::big);
+#endif
+		}
+
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(static_cast<uint32>(int32(-1))), 32);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(0u), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(1u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(2u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(3u), 2);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(0u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(1u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(2u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(3u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(4u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(5u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(6u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(7u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(8u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(9u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x7fffffffu)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x80000000u)), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x80000001u)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0xfffffffeu)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0xffffffffu)), false);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(0u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(3u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(4u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(5u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(6u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(7u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(8u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(9u), 16u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x7fffffffu)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x80000000u)), 0x80000000u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x80000001u)), 0u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0xfffffffeu)), 0u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0xffffffffu)), 0u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(0u), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(3u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(4u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(5u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(6u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(7u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(8u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(9u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x7fffffffu)), 0x40000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x80000000u)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x80000001u)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xfffffffeu)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xffffffffu)), 0x80000000u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(0u), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(3u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(4u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(5u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(6u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(7u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(8u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(9u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x7fffffffu)), 31u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000000u)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000001u)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xfffffffeu)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xffffffffu)), 32u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000001)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000011)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00001111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00011111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b01111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111111)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111110)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111100)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111000)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11110000)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11100000)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11000000)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b10000000)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000001)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000011)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000111)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00001111)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00011111)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00111111)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b01111111)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111110)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111100)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11110000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11100000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b10000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000001)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000011)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000111)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00001111)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00011111)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00111111)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b01111111)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111111)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111110)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111100)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11110000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11100000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b10000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000001)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000011)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00001111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00011111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b01111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111110)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111100)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111000)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11110000)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11100000)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11000000)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b10000000)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0xffffffffu), 32);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0xfffffffeu), 31);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x80000000u), 31);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x7fffffffu), 31);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x7ffffffeu), 30);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000007u), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000006u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000005u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000004u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000003u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000002u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000001u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000000u), 0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_BASE_BIT_HPP

Property changes on: src/mpt/base/tests/tests_base_bit.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_math.hpp
===================================================================
--- src/mpt/base/tests/tests_base_math.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_math.hpp	(working copy)
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_MATH_HPP
+#define MPT_BASE_TESTS_MATH_HPP
+
+
+
+#include "mpt/base/math.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_math{
+	"mpt/base/math",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.99), 2.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.5), 2.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.1), 1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.1), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.5), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.9), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-1.4), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-1.7), -2.0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_MATH_HPP

Property changes on: src/mpt/base/tests/tests_base_math.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_saturate_cast.hpp
===================================================================
--- src/mpt/base/tests/tests_base_saturate_cast.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_saturate_cast.hpp	(working copy)
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_SATURATE_CAST_HPP
+#define MPT_BASE_TESTS_SATURATE_CAST_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_saturate_cast{
+	"mpt/base/saturate_cast",
+	[](mpt::test::context & context) {
+		// trivials
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(-1), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(0), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(1), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(std::numeric_limits<int>::min()), std::numeric_limits<int>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(std::numeric_limits<int>::max()), std::numeric_limits<int>::max());
+
+		// signed / unsigned
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<uint16>::min()), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<uint16>::max()), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint32>::min()), (int32)std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint32>::max()), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int64>(std::numeric_limits<uint64>::min()), (int64)std::numeric_limits<uint64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int64>(std::numeric_limits<uint64>::max()), std::numeric_limits<int64>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min()), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max()), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min()), std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max()), (uint32)std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint64>(std::numeric_limits<int64>::min()), std::numeric_limits<uint64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint64>(std::numeric_limits<int64>::max()), (uint64)std::numeric_limits<int64>::max());
+
+		// overflow
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<int16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<int16>::max() + 1), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<int32>::max() + int64(1)), std::numeric_limits<int32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max() + 1), (uint16)std::numeric_limits<int16>::max() + 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max() + int64(1)), (uint32)std::numeric_limits<int32>::max() + 1);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(int16(32000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(int16(-32000)), -128);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(uint16(32000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(uint16(64000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(int16(32000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(int16(-32000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(uint16(32000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(uint16(64000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(int16(-32000)), -32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(uint16(64000)), 32767);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(int16(-32000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(uint16(64000)), 64000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(int16(-32000)), -32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(uint16(64000)), 64000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(int16(32000)), 32000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(int16(-32000)), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(uint16(32000)), 32000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(uint16(64000)), 64000u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int64>::max() - 1), std::numeric_limits<uint32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint64>::max() - 1), std::numeric_limits<int32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(static_cast<double>(std::numeric_limits<int64>::max())), std::numeric_limits<uint32>::max());
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_SATURATE_CAST_HPP

Property changes on: src/mpt/base/tests/tests_base_saturate_cast.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_saturate_round.hpp
===================================================================
--- src/mpt/base/tests/tests_base_saturate_round.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_saturate_round.hpp	(working copy)
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_SATURATE_ROUND_HPP
+#define MPT_BASE_TESTS_SATURATE_ROUND_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_round.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_saturate_round{
+	"mpt/base/saturate_round",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::max() + 0.1), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::max() - 0.4), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::min() + 0.1), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::min() - 0.1), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<uint32>(std::numeric_limits<uint32>::max() + 0.499), std::numeric_limits<uint32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(110.1), 110);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(-110.1), -110);
+
+		// These should fail to compile
+		//mpt::saturate_round<std::string>(1.0);
+		//mpt::saturate_round<int64>(1.0);
+		//mpt::saturate_round<uint64>(1.0);
+
+		// This should trigger assert in Round.
+		//MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(-129), 0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_SATURATE_ROUND_HPP

Property changes on: src/mpt/base/tests/tests_base_saturate_round.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_wrapping_divide.hpp
===================================================================
--- src/mpt/base/tests/tests_base_wrapping_divide.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_wrapping_divide.hpp	(working copy)
@@ -0,0 +1,163 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP
+#define MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/wrapping_divide.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_wrapping_divide{
+	"mpt/base/wrapping_divide",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-25, 12), 11);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-24, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-23, 12), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-8, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-7, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-6, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-5, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-4, 7), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-3, 7), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-2, 7), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-1, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(0, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(0, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(1, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(2, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(3, 7), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(4, 7), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(5, 7), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(6, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(7, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(8, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(23, 12), 11);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(24, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(25, 12), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(uint32(0x7fffffff), uint32(0x80000000)), uint32(0x7fffffff));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0x7ffffffe), int32(0x7fffffff)), int32(0x7ffffffe));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(2)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(2)), int32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(2)), int32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7fffffff)), int32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7fffffff)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7fffffff)), int32(1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffe)), int32(0x7ffffffc));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7ffffffe)), int32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7ffffffe)), int32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffd)), int32(0x7ffffffa));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7ffffffd)), int32(0x7ffffffb));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7ffffffd)), int32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), int32(0x7fffffff)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7fffffff)), int32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7fffffff)), int32(0x7ffffffd));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), int32(0x7ffffffe)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7ffffffe)), int32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7ffffffe)), int32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(2)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(2)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(2)), uint32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x40000001), uint32(0xffffffff)), uint32(0xbffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x40000000), uint32(0xffffffff)), uint32(0xbfffffff));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x3fffffff), uint32(0xffffffff)), uint32(0xc0000000));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000000)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000000)), uint32(2));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000001)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000001)), uint32(2));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000001)), uint32(3));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000000)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000000)), uint32(2));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7fffffff)), uint32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7fffffff)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7fffffff)), uint32(1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffe)), uint32(0x7ffffffc));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7ffffffe)), uint32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7ffffffe)), uint32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffd)), uint32(0x7ffffffa));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7ffffffd)), uint32(0x7ffffffb));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7ffffffd)), uint32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), uint32(0x7fffffff)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7fffffff)), uint32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7fffffff)), uint32(0x7ffffffd));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), uint32(0x7ffffffe)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7ffffffe)), uint32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7ffffffe)), uint32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-15, 7), -3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-14, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-13, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-12, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-11, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-10, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-9, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-8, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-7, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-6, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-5, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-4, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-3, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-2, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-1, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(0, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(1, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(2, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(3, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(4, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(5, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(6, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(7, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(8, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(9, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(10, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(11, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(12, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(13, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(14, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(15, 7), 2);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP

Property changes on: src/mpt/base/tests/tests_base_wrapping_divide.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/utility.hpp
===================================================================
--- src/mpt/base/utility.hpp	(nonexistent)
+++ src/mpt/base/utility.hpp	(working copy)
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_UTILITY_HPP
+#define MPT_BASE_UTILITY_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_CXX_BEFORE(20)
+#include "mpt/base/saturate_cast.hpp"
+#endif
+
+#include <type_traits>
+#include <utility>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::in_range;
+
+#else
+
+// Returns true iff Tdst can represent the value val.
+// Use as if(mpt::in_range<uint8>(-1)).
+template <typename Tdst, typename Tsrc>
+constexpr bool in_range(Tsrc val) {
+	return (static_cast<Tsrc>(mpt::saturate_cast<Tdst>(val)) == val);
+}
+
+#endif
+
+
+#if MPT_CXX_AT_LEAST(23)
+
+using std::to_underlying;
+
+#else
+
+template <typename T>
+constexpr std::underlying_type_t<T> to_underlying(T value) noexcept {
+	return static_cast<typename std::underlying_type<T>::type>(value);
+}
+
+#endif
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_UTILITY_HPP

Property changes on: src/mpt/base/utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/version.hpp
===================================================================
--- src/mpt/base/version.hpp	(nonexistent)
+++ src/mpt/base/version.hpp	(working copy)
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_VERSION_HPP
+#define MPT_BASE_VERSION_HPP
+
+
+
+#define MPT_VERSION_MAJOR 0
+#define MPT_VERSION_MINOR 0
+#define MPT_VERSION_PATCH 0
+#define MPT_VERSION_BUILD 0
+
+
+
+#endif // MPT_BASE_VERSION_HPP

Property changes on: src/mpt/base/version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/wrapping_divide.hpp
===================================================================
--- src/mpt/base/wrapping_divide.hpp	(nonexistent)
+++ src/mpt/base/wrapping_divide.hpp	(working copy)
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_WRAPPING_DIVIDE_HPP
+#define MPT_BASE_WRAPPING_DIVIDE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Modulo with more intuitive behaviour for some contexts:
+// Instead of being symmetrical around 0, the pattern for positive numbers is repeated in the negative range.
+// For example, wrapping_modulo(-1, m) == (m - 1).
+// Behaviour is undefined if m<=0.
+template <typename T, typename M>
+constexpr auto wrapping_modulo(T x, M m) -> decltype(x % m) {
+	return (x >= 0) ? (x % m) : (m - 1 - ((-1 - x) % m));
+}
+
+template <typename T, typename D>
+constexpr auto wrapping_divide(T x, D d) -> decltype(x / d) {
+	return (x >= 0) ? (x / d) : (((x + 1) / d) - 1);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_WRAPPING_DIVIDE_HPP

Property changes on: src/mpt/base/wrapping_divide.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/base64.hpp
===================================================================
--- src/mpt/binary/base64.hpp	(nonexistent)
+++ src/mpt/binary/base64.hpp	(working copy)
@@ -0,0 +1,136 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_BASE64_HPP
+#define MPT_BINARY_BASE64_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class base64_parse_error : public std::runtime_error {
+public:
+	base64_parse_error()
+		: std::runtime_error("invalid Base64 encoding") {
+	}
+};
+
+
+inline constexpr std::array<mpt::uchar, 64> base64 = {
+	{MPT_UCHAR('A'), MPT_UCHAR('B'), MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F'), MPT_UCHAR('G'), MPT_UCHAR('H'), MPT_UCHAR('I'), MPT_UCHAR('J'), MPT_UCHAR('K'), MPT_UCHAR('L'), MPT_UCHAR('M'), MPT_UCHAR('N'), MPT_UCHAR('O'), MPT_UCHAR('P'),
+	 MPT_UCHAR('Q'), MPT_UCHAR('R'), MPT_UCHAR('S'), MPT_UCHAR('T'), MPT_UCHAR('U'), MPT_UCHAR('V'), MPT_UCHAR('W'), MPT_UCHAR('X'), MPT_UCHAR('Y'), MPT_UCHAR('Z'), MPT_UCHAR('a'), MPT_UCHAR('b'), MPT_UCHAR('c'), MPT_UCHAR('d'), MPT_UCHAR('e'), MPT_UCHAR('f'),
+	 MPT_UCHAR('g'), MPT_UCHAR('h'), MPT_UCHAR('i'), MPT_UCHAR('j'), MPT_UCHAR('k'), MPT_UCHAR('l'), MPT_UCHAR('m'), MPT_UCHAR('n'), MPT_UCHAR('o'), MPT_UCHAR('p'), MPT_UCHAR('q'), MPT_UCHAR('r'), MPT_UCHAR('s'), MPT_UCHAR('t'), MPT_UCHAR('u'), MPT_UCHAR('v'),
+	 MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('+'), MPT_UCHAR('/')}};
+
+
+template <typename Tbyte>
+inline mpt::ustring encode_base64(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(4 * ((src.size() + 2) / 3));
+	uint32 bits = 0;
+	std::size_t bytes = 0;
+	for (std::byte byte : src) {
+		bits <<= 8;
+		bits |= mpt::byte_cast<uint8>(byte);
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64[(bits >> 18) & 0x3f]);
+			result.push_back(base64[(bits >> 12) & 0x3f]);
+			result.push_back(base64[(bits >> 6) & 0x3f]);
+			result.push_back(base64[(bits >> 0) & 0x3f]);
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	std::size_t padding = 0;
+	while (bytes != 0) {
+		bits <<= 8;
+		padding++;
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64[(bits >> 18) & 0x3f]);
+			result.push_back(base64[(bits >> 12) & 0x3f]);
+			if (padding > 1) {
+				result.push_back(MPT_UCHAR('='));
+			} else {
+				result.push_back(base64[(bits >> 6) & 0x3f]);
+			}
+			if (padding > 0) {
+				result.push_back(MPT_UCHAR('='));
+			} else {
+				result.push_back(base64[(bits >> 0) & 0x3f]);
+			}
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	return result;
+}
+
+inline uint8 decode_base64_bits(mpt::uchar c) {
+	for (uint8 i = 0; i < 64; ++i) {
+		if (base64[i] == c) {
+			return i;
+		}
+	}
+	throw base64_parse_error();
+}
+
+
+inline std::vector<std::byte> decode_base64(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(3 * (src.length() / 4));
+	uint32 bits = 0;
+	std::size_t chars = 0;
+	std::size_t padding = 0;
+	for (mpt::uchar c : src) {
+		bits <<= 6;
+		if (c == MPT_UCHAR('=')) {
+			padding++;
+		} else {
+			bits |= decode_base64_bits(c);
+		}
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			if (padding < 2) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			}
+			if (padding < 1) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			}
+			bits = 0;
+			chars = 0;
+			padding = 0;
+		}
+	}
+	if (chars != 0) {
+		throw base64_parse_error();
+	}
+	return result;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_BASE64_HPP

Property changes on: src/mpt/binary/base64.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/base64url.hpp
===================================================================
--- src/mpt/binary/base64url.hpp	(nonexistent)
+++ src/mpt/binary/base64url.hpp	(working copy)
@@ -0,0 +1,139 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_BASE64URL_HPP
+#define MPT_BINARY_BASE64URL_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class base64url_parse_error : public std::runtime_error {
+public:
+	base64url_parse_error()
+		: std::runtime_error("invalid Base64URL encoding") {
+	}
+};
+
+
+inline constexpr std::array<mpt::uchar, 64> base64url = {
+	{MPT_UCHAR('A'), MPT_UCHAR('B'), MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F'), MPT_UCHAR('G'), MPT_UCHAR('H'), MPT_UCHAR('I'), MPT_UCHAR('J'), MPT_UCHAR('K'), MPT_UCHAR('L'), MPT_UCHAR('M'), MPT_UCHAR('N'), MPT_UCHAR('O'), MPT_UCHAR('P'),
+	 MPT_UCHAR('Q'), MPT_UCHAR('R'), MPT_UCHAR('S'), MPT_UCHAR('T'), MPT_UCHAR('U'), MPT_UCHAR('V'), MPT_UCHAR('W'), MPT_UCHAR('X'), MPT_UCHAR('Y'), MPT_UCHAR('Z'), MPT_UCHAR('a'), MPT_UCHAR('b'), MPT_UCHAR('c'), MPT_UCHAR('d'), MPT_UCHAR('e'), MPT_UCHAR('f'),
+	 MPT_UCHAR('g'), MPT_UCHAR('h'), MPT_UCHAR('i'), MPT_UCHAR('j'), MPT_UCHAR('k'), MPT_UCHAR('l'), MPT_UCHAR('m'), MPT_UCHAR('n'), MPT_UCHAR('o'), MPT_UCHAR('p'), MPT_UCHAR('q'), MPT_UCHAR('r'), MPT_UCHAR('s'), MPT_UCHAR('t'), MPT_UCHAR('u'), MPT_UCHAR('v'),
+	 MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('-'), MPT_UCHAR('_')}};
+
+template <typename Tbyte>
+inline mpt::ustring encode_base64url(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(4 * ((src.size() + 2) / 3));
+	uint32 bits = 0;
+	std::size_t bytes = 0;
+	for (std::byte byte : src) {
+		bits <<= 8;
+		bits |= mpt::byte_cast<uint8>(byte);
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64url[(bits >> 18) & 0x3f]);
+			result.push_back(base64url[(bits >> 12) & 0x3f]);
+			result.push_back(base64url[(bits >> 6) & 0x3f]);
+			result.push_back(base64url[(bits >> 0) & 0x3f]);
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	std::size_t padding = 0;
+	while (bytes != 0) {
+		bits <<= 8;
+		padding++;
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64url[(bits >> 18) & 0x3f]);
+			result.push_back(base64url[(bits >> 12) & 0x3f]);
+			if (padding <= 1) {
+				result.push_back(base64url[(bits >> 6) & 0x3f]);
+			}
+			if (padding <= 0) {
+				result.push_back(base64url[(bits >> 0) & 0x3f]);
+			}
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	return result;
+}
+
+inline uint8 decode_base64url_bits(mpt::uchar c) {
+	for (uint8 i = 0; i < 64; ++i)
+	{
+		if (base64url[i] == c)
+		{
+			return i;
+		}
+	}
+	throw base64url_parse_error();
+}
+
+inline std::vector<std::byte> decode_base64url(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(3 * ((src.length() + 2) / 4));
+	uint32 bits = 0;
+	std::size_t chars = 0;
+	for (mpt::uchar c : src) {
+		bits <<= 6;
+		bits |= decode_base64url_bits(c);
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			bits = 0;
+			chars = 0;
+		}
+	}
+	uint32 padding = 0;
+	if (chars != 0 && chars < 2) {
+		throw base64url_parse_error();
+	}
+	while (chars != 0) {
+		bits <<= 6;
+		padding++;
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			if (padding < 2) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			}
+			if (padding < 1) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			}
+			bits = 0;
+			chars = 0;
+			padding = 0;
+		}
+	}
+	return result;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_BASE64URL_HPP

Property changes on: src/mpt/binary/base64url.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/hex.hpp
===================================================================
--- src/mpt/binary/hex.hpp	(nonexistent)
+++ src/mpt/binary/hex.hpp	(working copy)
@@ -0,0 +1,88 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_HEX_HPP
+#define MPT_BINARY_HEX_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline constexpr std::array<mpt::uchar, 16> encode_nibble = {
+	{MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'),
+	 MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'),
+	 MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('A'), MPT_UCHAR('B'),
+	 MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F')}};
+
+
+inline bool decode_byte(uint8 & byte, mpt::uchar c1, mpt::uchar c2) {
+	byte = 0;
+	if (MPT_UCHAR('0') <= c1 && c1 <= MPT_UCHAR('9')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('0')) << 4);
+	} else if (MPT_UCHAR('A') <= c1 && c1 <= MPT_UCHAR('F')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('A') + 10) << 4);
+	} else if (MPT_UCHAR('a') <= c1 && c1 <= MPT_UCHAR('f')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('a') + 10) << 4);
+	} else {
+		return false;
+	}
+	if (MPT_UCHAR('0') <= c2 && c2 <= MPT_UCHAR('9')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('0'));
+	} else if (MPT_UCHAR('A') <= c2 && c2 <= MPT_UCHAR('F')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('A') + 10);
+	} else if (MPT_UCHAR('a') <= c2 && c2 <= MPT_UCHAR('f')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('a') + 10);
+	} else {
+		return false;
+	}
+	return true;
+}
+
+
+template <typename Tbyte>
+inline mpt::ustring encode_hex(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(src.size() * 2);
+	for (std::byte byte : src) {
+		result.push_back(encode_nibble[(mpt::byte_cast<uint8>(byte) & 0xf0) >> 4]);
+		result.push_back(encode_nibble[mpt::byte_cast<uint8>(byte) & 0x0f]);
+	}
+	return result;
+}
+
+inline std::vector<std::byte> decode_hex(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(src.size() / 2);
+	for (std::size_t i = 0; (i + 1) < src.size(); i += 2) {
+		uint8 byte = 0;
+		if (!decode_byte(byte, src[i], src[i + 1])) {
+			return result;
+		}
+		result.push_back(mpt::byte_cast<std::byte>(byte));
+	}
+	return result;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_HEX_HPP

Property changes on: src/mpt/binary/hex.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/tests/tests_binary.hpp
===================================================================
--- src/mpt/binary/tests/tests_binary.hpp	(nonexistent)
+++ src/mpt/binary/tests/tests_binary.hpp	(working copy)
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_BINARY_HPP
+#define MPT_BASE_TESTS_BINARY_HPP
+
+
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/binary/base64.hpp"
+#include "mpt/binary/base64url.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_binary{
+	"mpt/binary",
+	[](mpt::test::context & context) {
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("cGxlYXN1cmUu"));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("bGVhc3VyZS4="));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("ZWFzdXJlLg=="));
+		}
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("cGxlYXN1cmUu")));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("bGVhc3VyZS4=")));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("ZWFzdXJlLg==")));
+		}
+
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("cGxlYXN1cmUu"));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("bGVhc3VyZS4"));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("ZWFzdXJlLg"));
+		}
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("cGxlYXN1cmUu")));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("bGVhc3VyZS4")));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("ZWFzdXJlLg")));
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_BINARY_HPP

Property changes on: src/mpt/binary/tests/tests_binary.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/libc.hpp
===================================================================
--- src/mpt/check/libc.hpp	(nonexistent)
+++ src/mpt/check/libc.hpp	(working copy)
@@ -0,0 +1,41 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_LIBC_HPP
+#define MPT_CHECK_LIBC_HPP
+
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+#ifndef __STDC_CONSTANT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_CONSTANT_MACROS
+MPT_WARNING("C stdlib does not provide constant macros. Please #define __STDC_CONSTANT_MACROS.")
+#endif
+#endif
+
+#ifndef __STDC_FORMAT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_FORMAT_MACROS
+MPT_WARNING("C stdlib does not provide limit macros. Please #define __STDC_FORMAT_MACROS.")
+#endif
+#endif
+
+#ifndef __STDC_LIMIT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_LIMIT_MACROS
+MPT_WARNING("C stdlib does not provide limit macros. Please #define __STDC_LIMIT_MACROS.")
+#endif
+#endif
+
+#ifndef _USE_MATH_DEFINES
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_USE_MATH_DEFINES
+MPT_WARNING("C stdlib does not provide math constants. Please #define _USE_MATH_DEFINES.")
+#endif
+#endif
+
+#if !MPT_LIBC_MS
+#if !defined(_FILE_OFFSET_BITS)
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_FILE_OFFSET_BITS
+MPT_WARNING("C stdlib may not provide 64bit std::FILE access. Please #define _FILE_OFFSET_BITS=64.")
+#endif
+#endif
+#endif
+
+#endif // MPT_CHECK_LIBC_HPP

Property changes on: src/mpt/check/libc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/mfc.hpp
===================================================================
--- src/mpt/check/mfc.hpp	(nonexistent)
+++ src/mpt/check/mfc.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_MFC_HPP
+#define MPT_CHECK_MFC_HPP
+
+#include "mpt/base/compiletime_warning.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#if MPT_DETECTED_MFC
+
+#ifndef _CSTRING_DISABLE_NARROW_WIDE_CONVERSION
+#ifndef MPT_CHECK_MFC_IGNORE_WARNING_NO_CSTRING_DISABLE_NARROW_WIDE_CONVERSION
+MPT_WARNING("MFC uses CString with automatic encoding conversions. Please #define _CSTRING_DISABLE_NARROW_WIDE_CONVERSION.")
+#endif
+#endif
+
+#endif // MPT_DETECTED_MFC
+
+#endif // MPT_CHECK_MFC_HPP

Property changes on: src/mpt/check/mfc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/windows.hpp
===================================================================
--- src/mpt/check/windows.hpp	(nonexistent)
+++ src/mpt/check/windows.hpp	(working copy)
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_WINDOWS_HPP
+#define MPT_CHECK_WINDOWS_HPP
+
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+#if MPT_OS_WINDOWS
+
+#ifndef UNICODE
+#ifndef MPT_CHECK_WINDOWS_IGNORE_WARNING_NO_UNICODE
+MPT_WARNING("windows.h uses MBCS TCHAR. Please #define UNICODE.")
+#endif
+#endif
+
+#ifndef NOMINMAX
+#ifndef MPT_CHECK_WINDOWS_IGNORE_WARNING_NO_NOMINMAX
+MPT_WARNING("windows.h defines min and max which conflicts with C++. Please #define NOMINMAX.")
+#endif
+#endif
+
+#endif // MPT_OS_WINDOWS
+
+#endif // MPT_CHECK_WINDOWS_HPP

Property changes on: src/mpt/check/windows.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crc/crc.hpp
===================================================================
--- src/mpt/crc/crc.hpp	(nonexistent)
+++ src/mpt/crc/crc.hpp	(working copy)
@@ -0,0 +1,205 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRC_CRC_HPP
+#define MPT_CRC_CRC_HPP
+
+
+
+#include "mpt/base/array.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+
+#include <array>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T, T polynomial, T initial, T resultXOR, bool reverseData>
+class crc {
+
+public:
+	using self_type = crc;
+	using value_type = T;
+	using byte_type = uint8;
+
+	static constexpr std::size_t size_bytes = sizeof(value_type);
+	static constexpr std::size_t size_bits = sizeof(value_type) * 8;
+	static constexpr value_type top_bit = static_cast<value_type>(1) << ((sizeof(value_type) * 8) - 1);
+
+private:
+	template <typename Tint>
+	static constexpr Tint reverse(Tint value) noexcept {
+		const std::size_t bits = sizeof(Tint) * 8;
+		Tint result = 0;
+		for (std::size_t i = 0; i < bits; ++i) {
+			result <<= 1;
+			result |= static_cast<Tint>(value & 0x1);
+			value >>= 1;
+		}
+		return result;
+	}
+
+	static constexpr value_type calculate_table_entry(byte_type pos) noexcept {
+		value_type value = 0;
+		value = (static_cast<value_type>(reverseData ? reverse(pos) : pos) << (size_bits - 8));
+		for (std::size_t bit = 0; bit < 8; ++bit) {
+			if (value & top_bit) {
+				value = (value << 1) ^ polynomial;
+			} else {
+				value = (value << 1);
+			}
+		}
+		value = (reverseData ? reverse(value) : value);
+		return value;
+	}
+
+private:
+	static constexpr std::array<value_type, 256> calculate_table() noexcept {
+		std::array<value_type, 256> t = mpt::init_array<value_type, 256>(value_type{});
+		for (std::size_t i = 0; i < 256; ++i) {
+			t[i] = calculate_table_entry(static_cast<byte_type>(i));
+		}
+		return t;
+	}
+
+	static constexpr std::array<value_type, 256> table = calculate_table();
+
+private:
+	constexpr value_type read_table(byte_type pos) const noexcept {
+		return table[pos];
+	}
+
+private:
+	value_type value;
+
+public:
+	constexpr crc() noexcept
+		: value(initial) {
+		return;
+	}
+
+	constexpr void processByte(byte_type byte) noexcept {
+		if constexpr (reverseData) {
+			value = (value >> 8) ^ read_table(static_cast<byte_type>((value & 0xff) ^ byte));
+		} else {
+			value = (value << 8) ^ read_table(static_cast<byte_type>(((value >> (size_bits - 8)) & 0xff) ^ byte));
+		}
+	}
+
+	constexpr value_type result() const noexcept {
+		return (value ^ resultXOR);
+	}
+
+public:
+	constexpr operator value_type() const noexcept {
+		return result();
+	}
+
+	inline crc & process(char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(signed char c) noexcept {
+		processByte(static_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(unsigned char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(std::byte c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	template <typename InputIt>
+	inline crc & process(InputIt beg, InputIt end) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			process(*it);
+		}
+		return *this;
+	}
+
+	template <typename Container>
+	inline crc & process(const Container & data) {
+		operator()(data.begin(), data.end());
+		return *this;
+	}
+
+	inline crc & operator()(char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(signed char c) noexcept {
+		processByte(static_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(unsigned char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(std::byte c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	template <typename InputIt>
+	crc & operator()(InputIt beg, InputIt end) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			operator()(*it);
+		}
+		return *this;
+	}
+
+	template <typename Container>
+	inline crc & operator()(const Container & data) {
+		operator()(data.begin(), data.end());
+		return *this;
+	}
+
+	template <typename InputIt>
+	crc(InputIt beg, InputIt end)
+		: value(initial) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			process(*it);
+		}
+	}
+
+	template <typename Container>
+	inline crc(const Container & data)
+		: value(initial) {
+		process(data.begin(), data.end());
+	}
+};
+
+using crc16 = crc<uint16, 0x8005, 0, 0, true>;
+using crc32 = crc<uint32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true>;
+using crc32_ogg = crc<uint32, 0x04C11DB7, 0, 0, false>;
+using crc32c = crc<uint32, 0x1EDC6F41, 0xFFFFFFFF, 0xFFFFFFFF, true>;
+using crc64_jones = crc<uint64, 0xAD93D23594C935A9ull, 0xFFFFFFFFFFFFFFFFull, 0, true>;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRC_CRC_HPP

Property changes on: src/mpt/crc/crc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crc/tests/tests_crc.hpp
===================================================================
--- src/mpt/crc/tests/tests_crc.hpp	(nonexistent)
+++ src/mpt/crc/tests/tests_crc.hpp	(working copy)
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_CRC_HPP
+#define MPT_BASE_TESTS_CRC_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/crc/crc.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_crc{
+	"mpt/crc",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::crc32(std::string("123456789")), 0xCBF43926u);
+		MPT_TEST_EXPECT_EQUAL(mpt::crc32_ogg(std::string("123456789")), 0x89a1897fu);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_CRC_HPP

Property changes on: src/mpt/crc/tests/tests_crc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/exception.hpp
===================================================================
--- src/mpt/crypto/exception.hpp	(nonexistent)
+++ src/mpt/crypto/exception.hpp	(working copy)
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_EXCEPTION_HPP
+#define MPT_CRYPTO_EXCEPTION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+
+#include <stdexcept>
+
+#if MPT_OS_WINDOWS
+#include <ncrypt.h>
+#include <wincrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS
+
+class exception
+	: public std::runtime_error {
+private:
+	NTSTATUS m_Status;
+
+public:
+	exception(NTSTATUS status)
+		: std::runtime_error("crypto error")
+		, m_Status(status) {
+		return;
+	}
+
+public:
+	NTSTATUS code() const noexcept {
+		return m_Status;
+	}
+};
+
+
+class security_exception
+	: public std::runtime_error {
+private:
+	SECURITY_STATUS m_Status;
+
+public:
+	security_exception(SECURITY_STATUS status)
+		: std::runtime_error("crypto error")
+		, m_Status(status) {
+		return;
+	}
+
+public:
+	SECURITY_STATUS code() const noexcept {
+		return m_Status;
+	}
+};
+
+
+inline void CheckNTSTATUS(NTSTATUS status) {
+	if (status >= 0) {
+		return;
+	} else if (status == STATUS_NO_MEMORY) {
+		mpt::throw_out_of_memory();
+	} else {
+		throw exception(status);
+	}
+}
+
+
+inline void CheckSECURITY_STATUS(SECURITY_STATUS status) {
+	if (status == ERROR_SUCCESS) {
+		return;
+	} else if (status == NTE_NO_MEMORY) {
+		mpt::throw_out_of_memory();
+	} else {
+		throw security_exception(status);
+	}
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace crypto
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_EXCEPTION_HPP

Property changes on: src/mpt/crypto/exception.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/hash.hpp
===================================================================
--- src/mpt/crypto/hash.hpp	(nonexistent)
+++ src/mpt/crypto/hash.hpp	(working copy)
@@ -0,0 +1,180 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_HASH_HPP
+#define MPT_CRYPTO_HASH_HPP
+
+
+
+#include "mpt/base/array.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/crypto/exception.hpp"
+
+#include <algorithm>
+#include <vector>
+
+#include <cassert>
+#include <cstddef>
+
+#if MPT_OS_WINDOWS
+#include <bcrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+namespace hash {
+
+
+struct hash_traits_md5 {
+	static constexpr std::size_t output_bits = 128;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_MD5_ALGORITHM;
+};
+
+struct hash_traits_sha1 {
+	static constexpr std::size_t output_bits = 160;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA1_ALGORITHM;
+};
+
+struct hash_traits_sha256 {
+	static constexpr std::size_t output_bits = 256;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA256_ALGORITHM;
+};
+
+struct hash_traits_sha512 {
+	static constexpr std::size_t output_bits = 512;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA512_ALGORITHM;
+};
+
+template <typename Traits>
+class hash_impl {
+
+public:
+	using traits = Traits;
+
+	using result_type = std::array<std::byte, traits::output_bytes>;
+
+private:
+	BCRYPT_ALG_HANDLE hAlg = NULL;
+	std::vector<BYTE> hashState;
+	std::vector<BYTE> hashResult;
+	BCRYPT_HASH_HANDLE hHash = NULL;
+
+private:
+	void init() {
+		CheckNTSTATUS(BCryptOpenAlgorithmProvider(&hAlg, traits::bcrypt_name, NULL, 0));
+		if (!hAlg) {
+			throw exception(0);
+		}
+		DWORD hashStateSize = 0;
+		DWORD hashStateSizeSize = 0;
+		CheckNTSTATUS(BCryptGetProperty(hAlg, BCRYPT_OBJECT_LENGTH, (PBYTE)&hashStateSize, sizeof(DWORD), &hashStateSizeSize, 0));
+		if (hashStateSizeSize != sizeof(DWORD)) {
+			throw exception(0);
+		}
+		if (hashStateSize <= 0) {
+			throw exception(0);
+		}
+		hashState.resize(hashStateSize);
+		DWORD hashResultSize = 0;
+		DWORD hashResultSizeSize = 0;
+		CheckNTSTATUS(BCryptGetProperty(hAlg, BCRYPT_HASH_LENGTH, (PBYTE)&hashResultSize, sizeof(DWORD), &hashResultSizeSize, 0));
+		if (hashResultSizeSize != sizeof(DWORD)) {
+			throw exception(0);
+		}
+		if (hashResultSize <= 0) {
+			throw exception(0);
+		}
+		if (hashResultSize != mpt::extent<result_type>()) {
+			throw exception(0);
+		}
+		hashResult.resize(hashResultSize);
+		CheckNTSTATUS(BCryptCreateHash(hAlg, &hHash, hashState.data(), hashStateSize, NULL, 0, 0));
+		if (!hHash) {
+			throw exception(0);
+		}
+	}
+
+	void cleanup() {
+		if (hHash) {
+			BCryptDestroyHash(hHash);
+			hHash = NULL;
+		}
+		hashResult.resize(0);
+		hashResult.shrink_to_fit();
+		hashState.resize(0);
+		hashState.shrink_to_fit();
+		if (hAlg) {
+			BCryptCloseAlgorithmProvider(hAlg, 0);
+			hAlg = NULL;
+		}
+	}
+
+public:
+	hash_impl() {
+		try {
+			init();
+		} catch (...) {
+			cleanup();
+			throw;
+		}
+	}
+	hash_impl(const hash_impl &) = delete;
+	hash_impl & operator=(const hash_impl &) = delete;
+	~hash_impl() {
+		cleanup();
+	}
+
+public:
+	hash_impl & process(mpt::const_byte_span data) {
+		CheckNTSTATUS(BCryptHashData(hHash, const_cast<UCHAR *>(mpt::byte_cast<const UCHAR *>(data.data())), mpt::saturate_cast<ULONG>(data.size()), 0));
+		return *this;
+	}
+
+	result_type result() {
+		result_type res = mpt::init_array<std::byte, traits::output_bytes>(std::byte{0});
+		CheckNTSTATUS(BCryptFinishHash(hHash, hashResult.data(), mpt::saturate_cast<ULONG>(hashResult.size()), 0));
+		assert(hashResult.size() == mpt::extent<result_type>());
+		std::transform(hashResult.begin(), hashResult.end(), res.begin(), [](BYTE b) { return mpt::as_byte(b); });
+		return res;
+	}
+};
+
+using MD5 = hash_impl<hash_traits_md5>;
+using SHA1 = hash_impl<hash_traits_sha1>;
+using SHA256 = hash_impl<hash_traits_sha256>;
+using SHA512 = hash_impl<hash_traits_sha512>;
+
+
+} // namespace hash
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace crypto
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_HASH_HPP

Property changes on: src/mpt/crypto/hash.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/jwk.hpp
===================================================================
--- src/mpt/crypto/jwk.hpp	(nonexistent)
+++ src/mpt/crypto/jwk.hpp	(working copy)
@@ -0,0 +1,532 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_JWK_HPP
+#define MPT_CRYPTO_JWK_HPP
+
+
+
+#include "mpt/base/alloc.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/binary/base64url.hpp"
+#include "mpt/crypto/exception.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+#include "mpt/json/json.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <algorithm>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include <cassert>
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+
+#if MPT_OS_WINDOWS
+#include <bcrypt.h>
+#include <ncrypt.h>
+#include <wincrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+
+
+class keystore {
+public:
+	enum class domain
+	{
+		system = 1,
+		user = 2,
+	};
+
+private:
+	NCRYPT_PROV_HANDLE hProv = NULL;
+	domain ProvDomain = domain::user;
+
+private:
+	void cleanup() {
+		if (hProv) {
+			NCryptFreeObject(hProv);
+			hProv = NULL;
+		}
+	}
+
+public:
+	keystore(domain d)
+		: ProvDomain(d) {
+		try {
+			CheckSECURITY_STATUS(NCryptOpenStorageProvider(&hProv, MS_KEY_STORAGE_PROVIDER, 0));
+		} catch (...) {
+			cleanup();
+			throw;
+		}
+	}
+	~keystore() {
+		return;
+	}
+	operator NCRYPT_PROV_HANDLE() {
+		return hProv;
+	}
+	keystore::domain store_domain() const {
+		return ProvDomain;
+	}
+};
+
+
+
+namespace asymmetric {
+
+
+
+class signature_verification_failed
+	: public std::runtime_error {
+public:
+	signature_verification_failed()
+		: std::runtime_error("Signature Verification failed.") {
+		return;
+	}
+};
+
+
+
+inline std::vector<mpt::ustring> jws_get_keynames(const mpt::ustring & jws_) {
+	std::vector<mpt::ustring> result;
+	nlohmann::json jws = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jws_));
+	for (const auto & s : jws["signatures"]) {
+		result.push_back(s["header"]["kid"]);
+	}
+	return result;
+}
+
+
+
+struct RSASSA_PSS_SHA512_traits {
+	using hash_type = mpt::crypto::hash::SHA512;
+	static constexpr const char * jwk_alg = "PS512";
+};
+
+
+
+template <typename Traits = RSASSA_PSS_SHA512_traits, std::size_t keysize = 4096>
+class rsassa_pss {
+
+public:
+	using hash_type = typename Traits::hash_type;
+	static constexpr const char * jwk_alg = Traits::jwk_alg;
+
+	struct public_key_data {
+
+		mpt::ustring name;
+		uint32 length = 0;
+		std::vector<std::byte> public_exp;
+		std::vector<std::byte> modulus;
+
+		std::vector<std::byte> as_cng_blob() const {
+			BCRYPT_RSAKEY_BLOB rsakey_blob{};
+			rsakey_blob.Magic = BCRYPT_RSAPUBLIC_MAGIC;
+			rsakey_blob.BitLength = length;
+			rsakey_blob.cbPublicExp = mpt::saturate_cast<ULONG>(public_exp.size());
+			rsakey_blob.cbModulus = mpt::saturate_cast<ULONG>(modulus.size());
+			std::vector<std::byte> result(sizeof(BCRYPT_RSAKEY_BLOB) + public_exp.size() + modulus.size());
+			std::memcpy(result.data(), &rsakey_blob, sizeof(BCRYPT_RSAKEY_BLOB));
+			std::memcpy(result.data() + sizeof(BCRYPT_RSAKEY_BLOB), public_exp.data(), public_exp.size());
+			std::memcpy(result.data() + sizeof(BCRYPT_RSAKEY_BLOB) + public_exp.size(), modulus.data(), modulus.size());
+			return result;
+		}
+
+		mpt::ustring as_jwk() const {
+			nlohmann::json json = nlohmann::json::object();
+			json["kid"] = name;
+			json["kty"] = "RSA";
+			json["alg"] = jwk_alg;
+			json["use"] = "sig";
+			json["e"] = mpt::encode_base64url(mpt::as_span(public_exp));
+			json["n"] = mpt::encode_base64url(mpt::as_span(modulus));
+			return mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, json.dump());
+		}
+
+		static public_key_data from_jwk(const mpt::ustring & jwk) {
+			public_key_data result;
+			try {
+				nlohmann::json json = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jwk));
+				if (json["kty"] != "RSA") {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				if (json["alg"] != jwk_alg) {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				if (json["use"] != "sig") {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				result.name = json["kid"].get<mpt::ustring>();
+				result.public_exp = mpt::decode_base64url(json["e"]);
+				result.modulus = mpt::decode_base64url(json["n"]);
+				result.length = mpt::saturate_cast<uint32>(result.modulus.size() * 8);
+			} catch (mpt::out_of_memory e) {
+				mpt::rethrow_out_of_memory(e);
+			} catch (...) {
+				throw std::runtime_error("Cannot parse RSA public key JWK.");
+			}
+			return result;
+		}
+
+		static public_key_data from_cng_blob(const mpt::ustring & name, const std::vector<std::byte> & blob) {
+			public_key_data result;
+			BCRYPT_RSAKEY_BLOB rsakey_blob{};
+			if (blob.size() < sizeof(BCRYPT_RSAKEY_BLOB)) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			std::memcpy(&rsakey_blob, blob.data(), sizeof(BCRYPT_RSAKEY_BLOB));
+			if (rsakey_blob.Magic != BCRYPT_RSAPUBLIC_MAGIC) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			if (blob.size() != sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp + rsakey_blob.cbModulus) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			result.name = name;
+			result.length = rsakey_blob.BitLength;
+			result.public_exp = std::vector<std::byte>(blob.data() + sizeof(BCRYPT_RSAKEY_BLOB), blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp);
+			result.modulus = std::vector<std::byte>(blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp, blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp + rsakey_blob.cbModulus);
+			return result;
+		}
+	};
+
+
+
+	static std::vector<public_key_data> parse_jwk_set(const mpt::ustring & jwk_set_) {
+		std::vector<public_key_data> result;
+		nlohmann::json jwk_set = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jwk_set_));
+		for (const auto & k : jwk_set["keys"]) {
+			try {
+				result.push_back(public_key_data::from_jwk(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, k.dump())));
+			} catch (...) {
+				// nothing
+			}
+		}
+		return result;
+	}
+
+
+
+	class public_key {
+
+	private:
+		mpt::ustring name;
+		BCRYPT_ALG_HANDLE hSignAlg = NULL;
+		BCRYPT_KEY_HANDLE hKey = NULL;
+
+	private:
+		void cleanup() {
+			if (hKey) {
+				BCryptDestroyKey(hKey);
+				hKey = NULL;
+			}
+			if (hSignAlg) {
+				BCryptCloseAlgorithmProvider(hSignAlg, 0);
+				hSignAlg = NULL;
+			}
+		}
+
+	public:
+		public_key(const public_key_data & data) {
+			try {
+				name = data.name;
+				CheckNTSTATUS(BCryptOpenAlgorithmProvider(&hSignAlg, BCRYPT_RSA_ALGORITHM, NULL, 0));
+				std::vector<std::byte> blob = data.as_cng_blob();
+				CheckNTSTATUS(BCryptImportKeyPair(hSignAlg, NULL, BCRYPT_RSAPUBLIC_BLOB, &hKey, mpt::byte_cast<UCHAR *>(blob.data()), mpt::saturate_cast<ULONG>(blob.size()), 0));
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		public_key(const public_key & other)
+			: public_key(other.get_public_key_data()) {
+			return;
+		}
+
+		public_key & operator=(const public_key & other) {
+			if (&other == this) {
+				return *this;
+			}
+			public_key copy(other);
+			{
+				using std::swap;
+				swap(copy.name, name);
+				swap(copy.hSignAlg, hSignAlg);
+				swap(copy.hKey, hKey);
+			}
+			return *this;
+		}
+
+		~public_key() {
+			cleanup();
+		}
+
+		mpt::ustring get_name() const {
+			return name;
+		}
+
+		public_key_data get_public_key_data() const {
+			DWORD bytes = 0;
+			CheckNTSTATUS(BCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, 0, &bytes, 0));
+			std::vector<std::byte> blob(bytes);
+			CheckNTSTATUS(BCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, mpt::byte_cast<BYTE *>(blob.data()), mpt::saturate_cast<DWORD>(blob.size()), &bytes, 0));
+			return public_key_data::from_cng_blob(name, blob);
+		}
+
+		void verify_hash(typename hash_type::result_type hash, std::vector<std::byte> signature) {
+			BCRYPT_PSS_PADDING_INFO paddinginfo;
+			paddinginfo.pszAlgId = hash_type::traits::bcrypt_name;
+			paddinginfo.cbSalt = mpt::saturate_cast<ULONG>(hash_type::traits::output_bytes);
+			NTSTATUS result = BCryptVerifySignature(hKey, &paddinginfo, mpt::byte_cast<UCHAR *>(hash.data()), mpt::saturate_cast<ULONG>(hash.size()), mpt::byte_cast<UCHAR *>(signature.data()), mpt::saturate_cast<ULONG>(signature.size()), BCRYPT_PAD_PSS);
+			if (result == 0x00000000 /*STATUS_SUCCESS*/) {
+				return;
+			}
+			if (result == 0xC000A000 /*STATUS_INVALID_SIGNATURE*/) {
+				throw signature_verification_failed();
+			}
+			CheckNTSTATUS(result);
+			throw signature_verification_failed();
+		}
+
+		void verify(mpt::const_byte_span payload, const std::vector<std::byte> & signature) {
+			verify_hash(hash_type().process(payload).result(), signature);
+		}
+
+		std::vector<std::byte> jws_verify(const mpt::ustring & jws_) {
+			nlohmann::json jws = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jws_));
+			std::vector<std::byte> payload = mpt::decode_base64url(jws["payload"]);
+			nlohmann::json jsignature = nlohmann::json::object();
+			bool sigfound = false;
+			for (const auto & s : jws["signatures"]) {
+				if (s["header"]["kid"] == mpt::convert<std::string>(mpt::common_encoding::utf8, name)) {
+					jsignature = s;
+					sigfound = true;
+				}
+			}
+			if (!sigfound) {
+				throw signature_verification_failed();
+			}
+			std::vector<std::byte> protectedheaderraw = mpt::decode_base64url(jsignature["protected"]);
+			std::vector<std::byte> signature = mpt::decode_base64url(jsignature["signature"]);
+			nlohmann::json header = nlohmann::json::parse(mpt::buffer_cast<std::string>(protectedheaderraw));
+			if (header["typ"] != "JWT") {
+				throw signature_verification_failed();
+			}
+			if (header["alg"] != jwk_alg) {
+				throw signature_verification_failed();
+			}
+			verify_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderraw)) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(payload)))))).result(), signature);
+			return payload;
+		}
+
+		std::vector<std::byte> jws_compact_verify(const mpt::ustring & jws) {
+			std::vector<mpt::ustring> parts = mpt::split<mpt::ustring>(jws, MPT_USTRING("."));
+			if (parts.size() != 3) {
+				throw signature_verification_failed();
+			}
+			std::vector<std::byte> protectedheaderraw = mpt::decode_base64url(parts[0]);
+			std::vector<std::byte> payload = mpt::decode_base64url(parts[1]);
+			std::vector<std::byte> signature = mpt::decode_base64url(parts[2]);
+			nlohmann::json header = nlohmann::json::parse(mpt::buffer_cast<std::string>(protectedheaderraw));
+			if (header["typ"] != "JWT") {
+				throw signature_verification_failed();
+			}
+			if (header["alg"] != jwk_alg) {
+				throw signature_verification_failed();
+			}
+			verify_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderraw)) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(payload)))))).result(), signature);
+			return payload;
+		}
+	};
+
+
+
+	static inline void jws_verify_at_least_one(std::vector<public_key> & keys, const std::vector<std::byte> & expectedPayload, const mpt::ustring & signature) {
+		std::vector<mpt::ustring> keynames = mpt::crypto::asymmetric::jws_get_keynames(signature);
+		bool sigchecked = false;
+		for (const auto & keyname : keynames) {
+			for (auto & key : keys) {
+				if (key.get_name() == keyname) {
+					if (expectedPayload != key.jws_verify(signature)) {
+						throw mpt::crypto::asymmetric::signature_verification_failed();
+					}
+					sigchecked = true;
+				}
+			}
+		}
+		if (!sigchecked) {
+			throw mpt::crypto::asymmetric::signature_verification_failed();
+		}
+	}
+
+
+
+	static inline std::vector<std::byte> jws_verify_at_least_one(std::vector<public_key> & keys, const mpt::ustring & signature) {
+		std::vector<mpt::ustring> keynames = mpt::crypto::asymmetric::jws_get_keynames(signature);
+		for (const auto & keyname : keynames) {
+			for (auto & key : keys) {
+				if (key.get_name() == keyname) {
+					return key.jws_verify(signature);
+				}
+			}
+		}
+		throw mpt::crypto::asymmetric::signature_verification_failed();
+	}
+
+
+
+	class managed_private_key {
+
+	private:
+		mpt::ustring name;
+		NCRYPT_KEY_HANDLE hKey = NULL;
+
+	private:
+		void cleanup() {
+			if (hKey) {
+				NCryptFreeObject(hKey);
+				hKey = NULL;
+			}
+		}
+
+	public:
+		managed_private_key() = delete;
+
+		managed_private_key(const managed_private_key &) = delete;
+
+		managed_private_key & operator=(const managed_private_key &) = delete;
+
+		managed_private_key(keystore & keystore) {
+			try {
+				CheckSECURITY_STATUS(NCryptCreatePersistedKey(keystore, &hKey, BCRYPT_RSA_ALGORITHM, NULL, 0, 0));
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		managed_private_key(keystore & keystore, const mpt::ustring & name_)
+			: name(name_) {
+			try {
+				SECURITY_STATUS openKeyStatus = NCryptOpenKey(keystore, &hKey, mpt::convert<std::wstring>(name).c_str(), 0, (keystore.store_domain() == keystore::domain::system ? NCRYPT_MACHINE_KEY_FLAG : 0));
+				if (openKeyStatus == NTE_BAD_KEYSET) {
+					CheckSECURITY_STATUS(NCryptCreatePersistedKey(keystore, &hKey, BCRYPT_RSA_ALGORITHM, mpt::convert<std::wstring>(name).c_str(), 0, (keystore.store_domain() == keystore::domain::system ? NCRYPT_MACHINE_KEY_FLAG : 0)));
+					DWORD length = mpt::saturate_cast<DWORD>(keysize);
+					CheckSECURITY_STATUS(NCryptSetProperty(hKey, NCRYPT_LENGTH_PROPERTY, (PBYTE)&length, mpt::saturate_cast<DWORD>(sizeof(DWORD)), 0));
+					CheckSECURITY_STATUS(NCryptFinalizeKey(hKey, 0));
+				} else {
+					CheckSECURITY_STATUS(openKeyStatus);
+				}
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		~managed_private_key() {
+			cleanup();
+		}
+
+		void destroy() {
+			CheckSECURITY_STATUS(NCryptDeleteKey(hKey, 0));
+			name = mpt::ustring();
+			hKey = NULL;
+		}
+
+	public:
+		public_key_data get_public_key_data() const {
+			DWORD bytes = 0;
+			CheckSECURITY_STATUS(NCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, NULL, 0, &bytes, 0));
+			std::vector<std::byte> blob(bytes);
+			CheckSECURITY_STATUS(NCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, mpt::byte_cast<BYTE *>(blob.data()), mpt::saturate_cast<DWORD>(blob.size()), &bytes, 0));
+			return public_key_data::from_cng_blob(name, blob);
+		}
+
+		std::vector<std::byte> sign_hash(typename hash_type::result_type hash) {
+			BCRYPT_PSS_PADDING_INFO paddinginfo;
+			paddinginfo.pszAlgId = hash_type::traits::bcrypt_name;
+			paddinginfo.cbSalt = mpt::saturate_cast<ULONG>(hash_type::traits::output_bytes);
+			DWORD bytes = 0;
+			CheckSECURITY_STATUS(NCryptSignHash(hKey, &paddinginfo, mpt::byte_cast<BYTE *>(hash.data()), mpt::saturate_cast<DWORD>(hash.size()), NULL, 0, &bytes, BCRYPT_PAD_PSS));
+			std::vector<std::byte> result(bytes);
+			CheckSECURITY_STATUS(NCryptSignHash(hKey, &paddinginfo, mpt::byte_cast<BYTE *>(hash.data()), mpt::saturate_cast<DWORD>(hash.size()), mpt::byte_cast<BYTE *>(result.data()), mpt::saturate_cast<DWORD>(result.size()), &bytes, BCRYPT_PAD_PSS));
+			return result;
+		}
+
+		std::vector<std::byte> sign(mpt::const_byte_span payload) {
+			return sign_hash(hash_type().process(payload).result());
+		}
+
+		mpt::ustring jws_compact_sign(mpt::const_byte_span payload) {
+			nlohmann::json protectedheader = nlohmann::json::object();
+			protectedheader["typ"] = "JWT";
+			protectedheader["alg"] = jwk_alg;
+			std::string protectedheaderstring = protectedheader.dump();
+			std::vector<std::byte> signature = sign_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload))))).result());
+			return mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(signature));
+		}
+
+		mpt::ustring jws_sign(mpt::const_byte_span payload) {
+			nlohmann::json protectedheader = nlohmann::json::object();
+			protectedheader["typ"] = "JWT";
+			protectedheader["alg"] = jwk_alg;
+			std::string protectedheaderstring = protectedheader.dump();
+			nlohmann::json header = nlohmann::json::object();
+			header["kid"] = name;
+			std::vector<std::byte> signature = sign_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload))))).result());
+			nlohmann::json jws = nlohmann::json::object();
+			jws["payload"] = mpt::encode_base64url(payload);
+			jws["signatures"] = nlohmann::json::array();
+			nlohmann::json jsignature = nlohmann::json::object();
+			jsignature["header"] = header;
+			jsignature["protected"] = mpt::encode_base64url(mpt::as_span(protectedheaderstring));
+			jsignature["signature"] = mpt::encode_base64url(mpt::as_span(signature));
+			jws["signatures"].push_back(jsignature);
+			return mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, jws.dump());
+		}
+	};
+
+}; // class rsassa_pss
+
+
+
+} // namespace asymmetric
+
+
+
+#endif // MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+
+
+} // namespace crypto
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_JWK_HPP

Property changes on: src/mpt/crypto/jwk.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/tests/tests_crypto.hpp
===================================================================
--- src/mpt/crypto/tests/tests_crypto.hpp	(nonexistent)
+++ src/mpt/crypto/tests/tests_crypto.hpp	(working copy)
@@ -0,0 +1,94 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_CRYPTO_HPP
+#define MPT_BASE_TESTS_CRYPTO_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/crypto/exception.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/crypto/jwk.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_crypto{
+	"mpt/crypto",
+	[](mpt::test::context & context) {
+
+#if MPT_OS_WINDOWS
+		mpt::crypto::hash::SHA512::result_type sha512_abc{
+			std::byte{0xdd}, std::byte{0xaf}, std::byte{0x35}, std::byte{0xa1}, std::byte{0x93}, std::byte{0x61}, std::byte{0x7a}, std::byte{0xba},
+			std::byte{0xcc}, std::byte{0x41}, std::byte{0x73}, std::byte{0x49}, std::byte{0xae}, std::byte{0x20}, std::byte{0x41}, std::byte{0x31},
+			std::byte{0x12}, std::byte{0xe6}, std::byte{0xfa}, std::byte{0x4e}, std::byte{0x89}, std::byte{0xa9}, std::byte{0x7e}, std::byte{0xa2},
+			std::byte{0x0a}, std::byte{0x9e}, std::byte{0xee}, std::byte{0xe6}, std::byte{0x4b}, std::byte{0x55}, std::byte{0xd3}, std::byte{0x9a},
+			std::byte{0x21}, std::byte{0x92}, std::byte{0x99}, std::byte{0x2a}, std::byte{0x27}, std::byte{0x4f}, std::byte{0xc1}, std::byte{0xa8},
+			std::byte{0x36}, std::byte{0xba}, std::byte{0x3c}, std::byte{0x23}, std::byte{0xa3}, std::byte{0xfe}, std::byte{0xeb}, std::byte{0xbd},
+			std::byte{0x45}, std::byte{0x4d}, std::byte{0x44}, std::byte{0x23}, std::byte{0x64}, std::byte{0x3c}, std::byte{0xe8}, std::byte{0x0e},
+			std::byte{0x2a}, std::byte{0x9a}, std::byte{0xc9}, std::byte{0x4f}, std::byte{0xa5}, std::byte{0x4c}, std::byte{0xa4}, std::byte{0x9f}};
+		MPT_TEST_EXPECT_EQUAL(mpt::crypto::hash::SHA512().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(std::string("abc")))).result(), sha512_abc);
+
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+		{
+
+			std::vector<std::byte> data = {std::byte{0x11}, std::byte{0x12}, std::byte{0x13}, std::byte{0x14}};
+
+			mpt::crypto::keystore keystore(mpt::crypto::keystore::domain::user);
+
+			mpt::crypto::asymmetric::rsassa_pss<>::managed_private_key key(keystore, U_("OpenMPT Test Key 1"));
+
+			auto publickeydata = key.get_public_key_data();
+
+			mpt::crypto::asymmetric::rsassa_pss<>::public_key pk{publickeydata};
+			mpt::crypto::asymmetric::rsassa_pss<>::public_key pk_copy{pk};
+			mpt::ustring jwk = publickeydata.as_jwk();
+
+			std::vector<std::byte> signature = key.sign(mpt::as_span(data));
+			mpt::ustring jws = key.jws_sign(mpt::as_span(data));
+			mpt::ustring jws_compact = key.jws_compact_sign(mpt::as_span(data));
+
+			try {
+				pk.verify(mpt::as_span(data), signature);
+				auto verifieddata1 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_verify(jws);
+				auto verifieddata2 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_compact_verify(jws_compact);
+				MPT_TEST_EXPECT_EQUAL(true, true);
+				MPT_TEST_EXPECT_EQUAL(data, verifieddata1);
+				MPT_TEST_EXPECT_EQUAL(data, verifieddata2);
+			} catch (const mpt::crypto::asymmetric::signature_verification_failed &) {
+				MPT_TEST_EXPECT_EQUAL(true, false);
+			}
+
+			key.destroy();
+		}
+
+#endif //  MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_CRYPTO_HPP

Property changes on: src/mpt/crypto/tests/tests_crypto.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/detect/mfc.hpp
===================================================================
--- src/mpt/detect/mfc.hpp	(nonexistent)
+++ src/mpt/detect/mfc.hpp	(working copy)
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_DETECT_MFC_HPP
+#define MPT_DETECT_MFC_HPP
+
+#include "mpt/base/compiletime_warning.hpp"
+
+#if defined(MPT_WITH_MFC)
+#if !__has_include(<afx.h>)
+#error "MPT_WITH_MFC defined but <afx.h> not found."
+#endif
+#if !MPT_COMPILER_GENERIC && !MPT_COMPILER_MSVC && !MPT_COMPILER_CLANG
+MPT_WARNING("Using MFC with unsupported compiler.")
+#endif
+#define MPT_DETECTED_MFC 1
+#else
+#define MPT_DETECTED_MFC 0
+#endif
+
+#endif // MPT_DETECT_MFC_HPP

Property changes on: src/mpt/detect/mfc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/detect/nlohmann_json.hpp
===================================================================
--- src/mpt/detect/nlohmann_json.hpp	(nonexistent)
+++ src/mpt/detect/nlohmann_json.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_DETECT_NLOHMANN_JSON_HPP
+#define MPT_DETECT_NLOHMANN_JSON_HPP
+
+#if defined(MPT_WITH_NLOHMANN_JSON)
+#if !__has_include(<nlohmann/json.hpp>)
+#error "MPT_WITH_NLOHMANN_JSON defined but <nlohmann/json.hpp> not found."
+#endif
+#define MPT_DETECTED_NLOHMANN_JSON 1
+#else
+#if __has_include(<nlohmann/json.hpp>)
+#define MPT_DETECTED_NLOHMANN_JSON 1
+#else
+#define MPT_DETECTED_NLOHMANN_JSON 0
+#endif
+#endif
+
+#endif // MPT_DETECT_NLOHMANN_JSON_HPP

Property changes on: src/mpt/detect/nlohmann_json.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/floatingpoint.hpp
===================================================================
--- src/mpt/endian/floatingpoint.hpp	(nonexistent)
+++ src/mpt/endian/floatingpoint.hpp	(working copy)
@@ -0,0 +1,441 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_FLOATINGPOINT_HPP
+#define MPT_ENDIAN_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/floatingpoint.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+
+#include <cmath>
+#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+// 1.0f --> 0x3f800000u
+MPT_FORCEINLINE uint32 EncodeIEEE754binary32(float32 f) {
+	if constexpr (mpt::float_traits<float32>::is_ieee754_binary32ne) {
+		return mpt::bit_cast<uint32>(f);
+	} else {
+		int e = 0;
+		float m = std::frexp(f, &e);
+		if (e == 0 && std::fabs(m) == 0.0f) {
+			uint32 expo = 0u;
+			uint32 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint32 mant = 0u;
+			uint32 i = 0u;
+			i |= (mant << 0) & 0x007fffffu;
+			i |= (expo << 23) & 0x7f800000u;
+			i |= (sign << 31) & 0x80000000u;
+			return i;
+		} else {
+			uint32 expo = e + 127 - 1;
+			uint32 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint32 mant = static_cast<uint32>(std::fabs(std::ldexp(m, 24)));
+			uint32 i = 0u;
+			i |= (mant << 0) & 0x007fffffu;
+			i |= (expo << 23) & 0x7f800000u;
+			i |= (sign << 31) & 0x80000000u;
+			return i;
+		}
+	}
+}
+
+MPT_FORCEINLINE uint64 EncodeIEEE754binary64(float64 f) {
+	if constexpr (mpt::float_traits<float64>::is_ieee754_binary64ne) {
+		return mpt::bit_cast<uint64>(f);
+	} else {
+		int e = 0;
+		double m = std::frexp(f, &e);
+		if (e == 0 && std::fabs(m) == 0.0) {
+			uint64 expo = 0u;
+			uint64 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint64 mant = 0u;
+			uint64 i = 0u;
+			i |= (mant << 0) & 0x000fffffffffffffull;
+			i |= (expo << 52) & 0x7ff0000000000000ull;
+			i |= (sign << 63) & 0x8000000000000000ull;
+			return i;
+		} else {
+			uint64 expo = static_cast<int64>(e) + 1023 - 1;
+			uint64 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint64 mant = static_cast<uint64>(std::fabs(std::ldexp(m, 53)));
+			uint64 i = 0u;
+			i |= (mant << 0) & 0x000fffffffffffffull;
+			i |= (expo << 52) & 0x7ff0000000000000ull;
+			i |= (sign << 63) & 0x8000000000000000ull;
+			return i;
+		}
+	}
+}
+
+// 0x3f800000u --> 1.0f
+MPT_FORCEINLINE float32 DecodeIEEE754binary32(uint32 i) {
+	if constexpr (mpt::float_traits<float32>::is_ieee754_binary32ne) {
+		return mpt::bit_cast<float32>(i);
+	} else {
+		uint32 mant = (i & 0x007fffffu) >> 0;
+		uint32 expo = (i & 0x7f800000u) >> 23;
+		uint32 sign = (i & 0x80000000u) >> 31;
+		if (expo == 0) {
+			float m = sign ? -static_cast<float>(mant) : static_cast<float>(mant);
+			int e = static_cast<int>(expo) - 127 + 1 - 24;
+			float f = std::ldexp(m, e);
+			return static_cast<float32>(f);
+		} else {
+			mant |= 0x00800000u;
+			float m = sign ? -static_cast<float>(mant) : static_cast<float>(mant);
+			int e = static_cast<int>(expo) - 127 + 1 - 24;
+			float f = std::ldexp(m, e);
+			return static_cast<float32>(f);
+		}
+	}
+}
+
+MPT_FORCEINLINE float64 DecodeIEEE754binary64(uint64 i) {
+	if constexpr (mpt::float_traits<float64>::is_ieee754_binary64ne) {
+		return mpt::bit_cast<float64>(i);
+	} else {
+		uint64 mant = (i & 0x000fffffffffffffull) >> 0;
+		uint64 expo = (i & 0x7ff0000000000000ull) >> 52;
+		uint64 sign = (i & 0x8000000000000000ull) >> 63;
+		if (expo == 0) {
+			double m = sign ? -static_cast<double>(mant) : static_cast<double>(mant);
+			int e = static_cast<int>(expo) - 1023 + 1 - 53;
+			double f = std::ldexp(m, e);
+			return static_cast<float64>(f);
+		} else {
+			mant |= 0x0010000000000000ull;
+			double m = sign ? -static_cast<double>(mant) : static_cast<double>(mant);
+			int e = static_cast<int>(expo) - 1023 + 1 - 53;
+			double f = std::ldexp(m, e);
+			return static_cast<float64>(f);
+		}
+	}
+}
+
+
+// template parameters are byte indices corresponding to the individual bytes of iee754 in memory
+template <std::size_t hihi, std::size_t hilo, std::size_t lohi, std::size_t lolo>
+struct IEEE754binary32Emulated {
+public:
+	using self_t = IEEE754binary32Emulated<hihi, hilo, lohi, lolo>;
+	std::byte bytes[4];
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		return bytes[i];
+	}
+	IEEE754binary32Emulated() = default;
+	MPT_FORCEINLINE explicit IEEE754binary32Emulated(float32 f) {
+		SetInt32(EncodeIEEE754binary32(f));
+	}
+	// b0...b3 are in memory order, i.e. depend on the endianness of this type
+	// little endian: (0x00,0x00,0x80,0x3f)
+	// big endian:    (0x3f,0x80,0x00,0x00)
+	MPT_FORCEINLINE explicit IEEE754binary32Emulated(std::byte b0, std::byte b1, std::byte b2, std::byte b3) {
+		bytes[0] = b0;
+		bytes[1] = b1;
+		bytes[2] = b2;
+		bytes[3] = b3;
+	}
+	MPT_FORCEINLINE operator float32() const {
+		return DecodeIEEE754binary32(GetInt32());
+	}
+	MPT_FORCEINLINE self_t & SetInt32(uint32 i) {
+		bytes[hihi] = static_cast<std::byte>(i >> 24);
+		bytes[hilo] = static_cast<std::byte>(i >> 16);
+		bytes[lohi] = static_cast<std::byte>(i >> 8);
+		bytes[lolo] = static_cast<std::byte>(i >> 0);
+		return *this;
+	}
+	MPT_FORCEINLINE uint32 GetInt32() const {
+		return 0u
+			| (static_cast<uint32>(bytes[hihi]) << 24)
+			| (static_cast<uint32>(bytes[hilo]) << 16)
+			| (static_cast<uint32>(bytes[lohi]) << 8)
+			| (static_cast<uint32>(bytes[lolo]) << 0);
+	}
+	MPT_FORCEINLINE bool operator==(const self_t & cmp) const {
+		return true
+			&& bytes[0] == cmp.bytes[0]
+			&& bytes[1] == cmp.bytes[1]
+			&& bytes[2] == cmp.bytes[2]
+			&& bytes[3] == cmp.bytes[3];
+	}
+	MPT_FORCEINLINE bool operator!=(const self_t & cmp) const {
+		return !(*this == cmp);
+	}
+};
+template <std::size_t hihihi, std::size_t hihilo, std::size_t hilohi, std::size_t hilolo, std::size_t lohihi, std::size_t lohilo, std::size_t lolohi, std::size_t lololo>
+struct IEEE754binary64Emulated {
+public:
+	using self_t = IEEE754binary64Emulated<hihihi, hihilo, hilohi, hilolo, lohihi, lohilo, lolohi, lololo>;
+	std::byte bytes[8];
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		return bytes[i];
+	}
+	IEEE754binary64Emulated() = default;
+	MPT_FORCEINLINE explicit IEEE754binary64Emulated(float64 f) {
+		SetInt64(EncodeIEEE754binary64(f));
+	}
+	MPT_FORCEINLINE explicit IEEE754binary64Emulated(std::byte b0, std::byte b1, std::byte b2, std::byte b3, std::byte b4, std::byte b5, std::byte b6, std::byte b7) {
+		bytes[0] = b0;
+		bytes[1] = b1;
+		bytes[2] = b2;
+		bytes[3] = b3;
+		bytes[4] = b4;
+		bytes[5] = b5;
+		bytes[6] = b6;
+		bytes[7] = b7;
+	}
+	MPT_FORCEINLINE operator float64() const {
+		return DecodeIEEE754binary64(GetInt64());
+	}
+	MPT_FORCEINLINE self_t & SetInt64(uint64 i) {
+		bytes[hihihi] = static_cast<std::byte>(i >> 56);
+		bytes[hihilo] = static_cast<std::byte>(i >> 48);
+		bytes[hilohi] = static_cast<std::byte>(i >> 40);
+		bytes[hilolo] = static_cast<std::byte>(i >> 32);
+		bytes[lohihi] = static_cast<std::byte>(i >> 24);
+		bytes[lohilo] = static_cast<std::byte>(i >> 16);
+		bytes[lolohi] = static_cast<std::byte>(i >> 8);
+		bytes[lololo] = static_cast<std::byte>(i >> 0);
+		return *this;
+	}
+	MPT_FORCEINLINE uint64 GetInt64() const {
+		return 0u
+			| (static_cast<uint64>(bytes[hihihi]) << 56)
+			| (static_cast<uint64>(bytes[hihilo]) << 48)
+			| (static_cast<uint64>(bytes[hilohi]) << 40)
+			| (static_cast<uint64>(bytes[hilolo]) << 32)
+			| (static_cast<uint64>(bytes[lohihi]) << 24)
+			| (static_cast<uint64>(bytes[lohilo]) << 16)
+			| (static_cast<uint64>(bytes[lolohi]) << 8)
+			| (static_cast<uint64>(bytes[lololo]) << 0);
+	}
+	MPT_FORCEINLINE bool operator==(const self_t & cmp) const {
+		return true
+			&& bytes[0] == cmp.bytes[0]
+			&& bytes[1] == cmp.bytes[1]
+			&& bytes[2] == cmp.bytes[2]
+			&& bytes[3] == cmp.bytes[3]
+			&& bytes[4] == cmp.bytes[4]
+			&& bytes[5] == cmp.bytes[5]
+			&& bytes[6] == cmp.bytes[6]
+			&& bytes[7] == cmp.bytes[7];
+	}
+	MPT_FORCEINLINE bool operator!=(const self_t & cmp) const {
+		return !(*this == cmp);
+	}
+};
+
+using IEEE754binary32EmulatedBE = IEEE754binary32Emulated<0, 1, 2, 3>;
+using IEEE754binary32EmulatedLE = IEEE754binary32Emulated<3, 2, 1, 0>;
+using IEEE754binary64EmulatedBE = IEEE754binary64Emulated<0, 1, 2, 3, 4, 5, 6, 7>;
+using IEEE754binary64EmulatedLE = IEEE754binary64Emulated<7, 6, 5, 4, 3, 2, 1, 0>;
+
+constexpr bool declare_binary_safe(const IEEE754binary32EmulatedBE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary32EmulatedLE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64EmulatedBE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64EmulatedLE &) {
+	return true;
+}
+
+static_assert(mpt::check_binary_size<IEEE754binary32EmulatedBE>(4));
+static_assert(mpt::check_binary_size<IEEE754binary32EmulatedLE>(4));
+static_assert(mpt::check_binary_size<IEEE754binary64EmulatedBE>(8));
+static_assert(mpt::check_binary_size<IEEE754binary64EmulatedLE>(8));
+
+template <mpt::endian endian = mpt::endian::native>
+struct IEEE754binary32Native {
+public:
+	float32 value;
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			return static_cast<std::byte>(EncodeIEEE754binary32(value) >> (i * 8));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			return static_cast<std::byte>(EncodeIEEE754binary32(value) >> ((4 - 1 - i) * 8));
+		}
+	}
+	IEEE754binary32Native() = default;
+	MPT_FORCEINLINE explicit IEEE754binary32Native(float32 f) {
+		value = f;
+	}
+	// b0...b3 are in memory order, i.e. depend on the endianness of this type
+	// little endian: (0x00,0x00,0x80,0x3f)
+	// big endian:    (0x3f,0x80,0x00,0x00)
+	MPT_FORCEINLINE explicit IEEE754binary32Native(std::byte b0, std::byte b1, std::byte b2, std::byte b3) {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			value = DecodeIEEE754binary32(0u | (static_cast<uint32>(b0) << 0) | (static_cast<uint32>(b1) << 8) | (static_cast<uint32>(b2) << 16) | (static_cast<uint32>(b3) << 24));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			value = DecodeIEEE754binary32(0u | (static_cast<uint32>(b0) << 24) | (static_cast<uint32>(b1) << 16) | (static_cast<uint32>(b2) << 8) | (static_cast<uint32>(b3) << 0));
+		}
+	}
+	MPT_FORCEINLINE operator float32() const {
+		return value;
+	}
+	MPT_FORCEINLINE IEEE754binary32Native & SetInt32(uint32 i) {
+		value = DecodeIEEE754binary32(i);
+		return *this;
+	}
+	MPT_FORCEINLINE uint32 GetInt32() const {
+		return EncodeIEEE754binary32(value);
+	}
+	MPT_FORCEINLINE bool operator==(const IEEE754binary32Native & cmp) const {
+		return value == cmp.value;
+	}
+	MPT_FORCEINLINE bool operator!=(const IEEE754binary32Native & cmp) const {
+		return value != cmp.value;
+	}
+};
+
+template <mpt::endian endian = mpt::endian::native>
+struct IEEE754binary64Native {
+public:
+	float64 value;
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			return mpt::byte_cast<std::byte>(static_cast<uint8>(EncodeIEEE754binary64(value) >> (i * 8)));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			return mpt::byte_cast<std::byte>(static_cast<uint8>(EncodeIEEE754binary64(value) >> ((8 - 1 - i) * 8)));
+		}
+	}
+	IEEE754binary64Native() = default;
+	MPT_FORCEINLINE explicit IEEE754binary64Native(float64 f) {
+		value = f;
+	}
+	MPT_FORCEINLINE explicit IEEE754binary64Native(std::byte b0, std::byte b1, std::byte b2, std::byte b3, std::byte b4, std::byte b5, std::byte b6, std::byte b7) {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			value = DecodeIEEE754binary64(0ull | (static_cast<uint64>(b0) << 0) | (static_cast<uint64>(b1) << 8) | (static_cast<uint64>(b2) << 16) | (static_cast<uint64>(b3) << 24) | (static_cast<uint64>(b4) << 32) | (static_cast<uint64>(b5) << 40) | (static_cast<uint64>(b6) << 48) | (static_cast<uint64>(b7) << 56));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			value = DecodeIEEE754binary64(0ull | (static_cast<uint64>(b0) << 56) | (static_cast<uint64>(b1) << 48) | (static_cast<uint64>(b2) << 40) | (static_cast<uint64>(b3) << 32) | (static_cast<uint64>(b4) << 24) | (static_cast<uint64>(b5) << 16) | (static_cast<uint64>(b6) << 8) | (static_cast<uint64>(b7) << 0));
+		}
+	}
+	MPT_FORCEINLINE operator float64() const {
+		return value;
+	}
+	MPT_FORCEINLINE IEEE754binary64Native & SetInt64(uint64 i) {
+		value = DecodeIEEE754binary64(i);
+		return *this;
+	}
+	MPT_FORCEINLINE uint64 GetInt64() const {
+		return EncodeIEEE754binary64(value);
+	}
+	MPT_FORCEINLINE bool operator==(const IEEE754binary64Native & cmp) const {
+		return value == cmp.value;
+	}
+	MPT_FORCEINLINE bool operator!=(const IEEE754binary64Native & cmp) const {
+		return value != cmp.value;
+	}
+};
+
+static_assert((sizeof(IEEE754binary32Native<>) == 4));
+static_assert((sizeof(IEEE754binary64Native<>) == 8));
+
+constexpr bool declare_binary_safe(const IEEE754binary32Native<> &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64Native<> &) noexcept {
+	return true;
+}
+
+template <bool is_ieee754, mpt::endian endian = mpt::endian::native>
+struct IEEE754binary_types {
+	using IEEE754binary32LE = IEEE754binary32EmulatedLE;
+	using IEEE754binary32BE = IEEE754binary32EmulatedBE;
+	using IEEE754binary64LE = IEEE754binary64EmulatedLE;
+	using IEEE754binary64BE = IEEE754binary64EmulatedBE;
+};
+template <>
+struct IEEE754binary_types<true, mpt::endian::little> {
+	using IEEE754binary32LE = IEEE754binary32Native<>;
+	using IEEE754binary32BE = IEEE754binary32EmulatedBE;
+	using IEEE754binary64LE = IEEE754binary64Native<>;
+	using IEEE754binary64BE = IEEE754binary64EmulatedBE;
+};
+template <>
+struct IEEE754binary_types<true, mpt::endian::big> {
+	using IEEE754binary32LE = IEEE754binary32EmulatedLE;
+	using IEEE754binary32BE = IEEE754binary32Native<>;
+	using IEEE754binary64LE = IEEE754binary64EmulatedLE;
+	using IEEE754binary64BE = IEEE754binary64Native<>;
+};
+
+using IEEE754binary32LE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32LE;
+using IEEE754binary32BE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32BE;
+using IEEE754binary64LE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64LE;
+using IEEE754binary64BE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64BE;
+
+static_assert(sizeof(IEEE754binary32LE) == 4);
+static_assert(sizeof(IEEE754binary32BE) == 4);
+static_assert(sizeof(IEEE754binary64LE) == 8);
+static_assert(sizeof(IEEE754binary64BE) == 8);
+
+
+// unaligned
+
+using float32le = IEEE754binary32EmulatedLE;
+using float32be = IEEE754binary32EmulatedBE;
+using float64le = IEEE754binary64EmulatedLE;
+using float64be = IEEE754binary64EmulatedBE;
+
+static_assert(sizeof(float32le) == 4);
+static_assert(sizeof(float32be) == 4);
+static_assert(sizeof(float64le) == 8);
+static_assert(sizeof(float64be) == 8);
+
+
+// potentially aligned
+
+using float32le_fast = IEEE754binary32LE;
+using float32be_fast = IEEE754binary32BE;
+using float64le_fast = IEEE754binary64LE;
+using float64be_fast = IEEE754binary64BE;
+
+static_assert(sizeof(float32le_fast) == 4);
+static_assert(sizeof(float32be_fast) == 4);
+static_assert(sizeof(float64le_fast) == 8);
+static_assert(sizeof(float64be_fast) == 8);
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_FLOATINGPOINT_HPP

Property changes on: src/mpt/endian/floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/integer.hpp
===================================================================
--- src/mpt/endian/integer.hpp	(nonexistent)
+++ src/mpt/endian/integer.hpp	(working copy)
@@ -0,0 +1,487 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_INTEGER_HPP
+#define MPT_ENDIAN_INTEGER_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/bit.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#include <limits>
+#include <type_traits>
+
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+
+#if MPT_COMPILER_MSVC
+#include <intrin.h>
+#endif
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+struct BigEndian_tag {
+	static constexpr mpt::endian endian = mpt::endian::big;
+};
+
+struct LittleEndian_tag {
+	static constexpr mpt::endian endian = mpt::endian::little;
+};
+
+
+
+constexpr inline uint16 constexpr_bswap16(uint16 x) noexcept {
+	return uint16(0)
+		| ((x >> 8) & 0x00FFu)
+		| ((x << 8) & 0xFF00u);
+}
+
+constexpr inline uint32 constexpr_bswap32(uint32 x) noexcept {
+	return uint32(0)
+		| ((x & 0x000000FFu) << 24)
+		| ((x & 0x0000FF00u) << 8)
+		| ((x & 0x00FF0000u) >> 8)
+		| ((x & 0xFF000000u) >> 24);
+}
+
+constexpr inline uint64 constexpr_bswap64(uint64 x) noexcept {
+	return uint64(0)
+		| (((x >> 0) & 0xffull) << 56)
+		| (((x >> 8) & 0xffull) << 48)
+		| (((x >> 16) & 0xffull) << 40)
+		| (((x >> 24) & 0xffull) << 32)
+		| (((x >> 32) & 0xffull) << 24)
+		| (((x >> 40) & 0xffull) << 16)
+		| (((x >> 48) & 0xffull) << 8)
+		| (((x >> 56) & 0xffull) << 0);
+}
+
+#if MPT_COMPILER_GCC
+#define MPT_bswap16 __builtin_bswap16
+#define MPT_bswap32 __builtin_bswap32
+#define MPT_bswap64 __builtin_bswap64
+#elif MPT_COMPILER_MSVC
+#define MPT_bswap16 _byteswap_ushort
+#define MPT_bswap32 _byteswap_ulong
+#define MPT_bswap64 _byteswap_uint64
+#endif
+
+// No intrinsics available
+#ifndef MPT_bswap16
+#define MPT_bswap16(x) mpt::constexpr_bswap16(x)
+#endif
+#ifndef MPT_bswap32
+#define MPT_bswap32(x) mpt::constexpr_bswap32(x)
+#endif
+#ifndef MPT_bswap64
+#define MPT_bswap64(x) mpt::constexpr_bswap64(x)
+#endif
+
+
+
+template <typename T, typename Tendian, std::size_t size>
+MPT_CONSTEXPRINLINE std::array<std::byte, size> EndianEncode(T val) noexcept {
+	static_assert(Tendian::endian == mpt::endian::little || Tendian::endian == mpt::endian::big);
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(!std::numeric_limits<T>::is_signed);
+	static_assert(sizeof(T) == size);
+	using base_type = T;
+	using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+	using endian_type = Tendian;
+	unsigned_base_type uval = static_cast<unsigned_base_type>(val);
+	std::array<std::byte, size> data{};
+	if constexpr (endian_type::endian == mpt::endian::little) {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			data[i] = static_cast<std::byte>(static_cast<uint8>((uval >> (i * 8)) & 0xffu));
+		}
+	} else {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			data[(sizeof(base_type) - 1) - i] = static_cast<std::byte>(static_cast<uint8>((uval >> (i * 8)) & 0xffu));
+		}
+	}
+	return data;
+}
+
+template <typename T, typename Tendian, std::size_t size>
+MPT_CONSTEXPRINLINE T EndianDecode(std::array<std::byte, size> data) noexcept {
+	static_assert(Tendian::endian == mpt::endian::little || Tendian::endian == mpt::endian::big);
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(!std::numeric_limits<T>::is_signed);
+	static_assert(sizeof(T) == size);
+	using base_type = T;
+	using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+	using endian_type = Tendian;
+	base_type val = base_type();
+	unsigned_base_type uval = unsigned_base_type();
+	if constexpr (endian_type::endian == mpt::endian::little) {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			uval |= static_cast<unsigned_base_type>(static_cast<uint8>(data[i])) << (i * 8);
+		}
+	} else {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			uval |= static_cast<unsigned_base_type>(static_cast<uint8>(data[(sizeof(base_type) - 1) - i])) << (i * 8);
+		}
+	}
+	val = static_cast<base_type>(uval);
+	return val;
+}
+
+
+MPT_CONSTEXPR20_FUN uint64 SwapBytesImpl(uint64 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap64(value);
+	}
+	else {
+		return MPT_bswap64(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN uint32 SwapBytesImpl(uint32 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap32(value);
+	}
+	else {
+		return MPT_bswap32(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN uint16 SwapBytesImpl(uint16 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap16(value);
+	}
+	else {
+		return MPT_bswap16(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int64 SwapBytesImpl(int64 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap64(value);
+	}
+	else {
+		return MPT_bswap64(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int32 SwapBytesImpl(int32 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap32(value);
+	}
+	else {
+		return MPT_bswap32(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int16 SwapBytesImpl(int16 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap16(value);
+	}
+	else {
+		return MPT_bswap16(value);
+	}
+}
+
+// Do NOT remove these overloads, even if they seem useless.
+// We do not want risking to extend 8bit integers to int and then
+// endian-converting and casting back to int.
+// Thus these overloads.
+
+MPT_CONSTEXPR20_FUN uint8 SwapBytesImpl(uint8 value) noexcept {
+	return value;
+}
+
+MPT_CONSTEXPR20_FUN int8 SwapBytesImpl(int8 value) noexcept {
+	return value;
+}
+
+MPT_CONSTEXPR20_FUN char SwapBytesImpl(char value) noexcept {
+	return value;
+}
+
+#undef MPT_bswap16
+#undef MPT_bswap32
+#undef MPT_bswap64
+
+
+
+// On-disk integer types with defined endianness and no alignemnt requirements
+// Note: To easily debug module loaders (and anything else that uses this
+// wrapper struct), you can use the Debugger Visualizers available in
+// build/vs/debug/ to conveniently view the wrapped contents.
+
+template <typename T, typename Tendian>
+struct packed {
+public:
+	using base_type = T;
+	using endian_type = Tendian;
+
+public:
+	std::array<std::byte, sizeof(base_type)> data;
+
+public:
+	MPT_CONSTEXPR20_FUN void set(base_type val) noexcept {
+		static_assert(std::numeric_limits<T>::is_integer);
+		MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+			if constexpr (endian_type::endian == mpt::endian::big) {
+				typename std::make_unsigned<base_type>::type uval = val;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					data[i] = static_cast<std::byte>((uval >> (8 * (sizeof(base_type) - 1 - i))) & 0xffu);
+				}
+			} else {
+				typename std::make_unsigned<base_type>::type uval = val;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					data[i] = static_cast<std::byte>((uval >> (8 * i)) & 0xffu);
+				}
+			}
+		}
+		else {
+			if constexpr (mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big) {
+				if constexpr (mpt::endian::native != endian_type::endian) {
+					val = mpt::SwapBytesImpl(val);
+				}
+				std::memcpy(data.data(), &val, sizeof(val));
+			} else {
+				using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+				data = EndianEncode<unsigned_base_type, Tendian, sizeof(T)>(val);
+			}
+		}
+	}
+	MPT_CONSTEXPR20_FUN base_type get() const noexcept {
+		static_assert(std::numeric_limits<T>::is_integer);
+		MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+			if constexpr (endian_type::endian == mpt::endian::big) {
+				typename std::make_unsigned<base_type>::type uval = 0;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					uval |= static_cast<typename std::make_unsigned<base_type>::type>(data[i]) << (8 * (sizeof(base_type) - 1 - i));
+				}
+				return static_cast<base_type>(uval);
+			} else {
+				typename std::make_unsigned<base_type>::type uval = 0;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					uval |= static_cast<typename std::make_unsigned<base_type>::type>(data[i]) << (8 * i);
+				}
+				return static_cast<base_type>(uval);
+			}
+		}
+		else {
+			if constexpr (mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big) {
+				base_type val = base_type();
+				std::memcpy(&val, data.data(), sizeof(val));
+				if constexpr (mpt::endian::native != endian_type::endian) {
+					val = mpt::SwapBytesImpl(val);
+				}
+				return val;
+			} else {
+				using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+				return EndianDecode<unsigned_base_type, Tendian, sizeof(T)>(data);
+			}
+		}
+	}
+	MPT_CONSTEXPR20_FUN packed & operator=(const base_type & val) noexcept {
+		set(val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN operator base_type() const noexcept {
+		return get();
+	}
+
+public:
+	MPT_CONSTEXPR20_FUN packed & operator&=(base_type val) noexcept {
+		set(get() & val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator|=(base_type val) noexcept {
+		set(get() | val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator^=(base_type val) noexcept {
+		set(get() ^ val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator+=(base_type val) noexcept {
+		set(get() + val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator-=(base_type val) noexcept {
+		set(get() - val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator*=(base_type val) noexcept {
+		set(get() * val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator/=(base_type val) noexcept {
+		set(get() / val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator%=(base_type val) noexcept {
+		set(get() % val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator++() noexcept { // prefix
+		set(get() + 1);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator--() noexcept { // prefix
+		set(get() - 1);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN base_type operator++(int) noexcept { // postfix
+		base_type old = get();
+		set(old + 1);
+		return old;
+	}
+	MPT_CONSTEXPR20_FUN base_type operator--(int) noexcept { // postfix
+		base_type old = get();
+		set(old - 1);
+		return old;
+	}
+};
+
+using int64le = packed<int64, LittleEndian_tag>;
+using int32le = packed<int32, LittleEndian_tag>;
+using int16le = packed<int16, LittleEndian_tag>;
+using int8le = packed<int8, LittleEndian_tag>;
+using uint64le = packed<uint64, LittleEndian_tag>;
+using uint32le = packed<uint32, LittleEndian_tag>;
+using uint16le = packed<uint16, LittleEndian_tag>;
+using uint8le = packed<uint8, LittleEndian_tag>;
+
+using int64be = packed<int64, BigEndian_tag>;
+using int32be = packed<int32, BigEndian_tag>;
+using int16be = packed<int16, BigEndian_tag>;
+using int8be = packed<int8, BigEndian_tag>;
+using uint64be = packed<uint64, BigEndian_tag>;
+using uint32be = packed<uint32, BigEndian_tag>;
+using uint16be = packed<uint16, BigEndian_tag>;
+using uint8be = packed<uint8, BigEndian_tag>;
+
+constexpr bool declare_binary_safe(const int64le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int32le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int16le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint64le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint32le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint16le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8le &) {
+	return true;
+}
+
+constexpr bool declare_binary_safe(const int64be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int32be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int16be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint64be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint32be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint16be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8be &) {
+	return true;
+}
+
+static_assert(mpt::check_binary_size<int64le>(8));
+static_assert(mpt::check_binary_size<int32le>(4));
+static_assert(mpt::check_binary_size<int16le>(2));
+static_assert(mpt::check_binary_size<int8le>(1));
+static_assert(mpt::check_binary_size<uint64le>(8));
+static_assert(mpt::check_binary_size<uint32le>(4));
+static_assert(mpt::check_binary_size<uint16le>(2));
+static_assert(mpt::check_binary_size<uint8le>(1));
+
+static_assert(mpt::check_binary_size<int64be>(8));
+static_assert(mpt::check_binary_size<int32be>(4));
+static_assert(mpt::check_binary_size<int16be>(2));
+static_assert(mpt::check_binary_size<int8be>(1));
+static_assert(mpt::check_binary_size<uint64be>(8));
+static_assert(mpt::check_binary_size<uint32be>(4));
+static_assert(mpt::check_binary_size<uint16be>(2));
+static_assert(mpt::check_binary_size<uint8be>(1));
+
+
+
+template <typename T>
+struct make_le {
+	using type = packed<typename std::remove_const<T>::type, LittleEndian_tag>;
+};
+
+template <typename T>
+struct make_be {
+	using type = packed<typename std::remove_const<T>::type, BigEndian_tag>;
+};
+
+template <typename T>
+MPT_CONSTEXPR20_FUN auto as_le(T v) noexcept -> typename mpt::make_le<typename std::remove_const<T>::type>::type {
+	typename mpt::make_le<typename std::remove_const<T>::type>::type res{};
+	res = v;
+	return res;
+}
+
+template <typename T>
+MPT_CONSTEXPR20_FUN auto as_be(T v) noexcept -> typename mpt::make_be<typename std::remove_const<T>::type>::type {
+	typename mpt::make_be<typename std::remove_const<T>::type>::type res{};
+	res = v;
+	return res;
+}
+
+template <typename Tpacked>
+MPT_CONSTEXPR20_FUN Tpacked as_endian(typename Tpacked::base_type v) noexcept {
+	Tpacked res{};
+	res = v;
+	return res;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+namespace std {
+template <typename T, typename Tendian>
+class numeric_limits<mpt::packed<T, Tendian>> : public std::numeric_limits<T> { };
+template <typename T, typename Tendian>
+class numeric_limits<const mpt::packed<T, Tendian>> : public std::numeric_limits<const T> { };
+} // namespace std
+
+
+
+#endif // MPT_ENDIAN_INTEGER_HPP

Property changes on: src/mpt/endian/integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/tests/tests_endian_floatingpoint.hpp
===================================================================
--- src/mpt/endian/tests/tests_endian_floatingpoint.hpp	(nonexistent)
+++ src/mpt/endian/tests/tests_endian_floatingpoint.hpp	(working copy)
@@ -0,0 +1,66 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP
+#define MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/floatingpoint.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_endian_floatingpoint{
+	"mpt/endian/floatingpoint",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary32(1.0f), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary32(-1.0f), 0xbf800000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x00000000u), 0.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x41840000u), 16.5f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3faa0000u), 1.328125f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0xbfaa0000u), -1.328125f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3f800000u), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x00000000u), 0.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0xbf800000u), -1.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3f800000u), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(1.0f).GetInt32(), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(1.0f).GetInt32(), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x80), mpt::as_byte(0x3f)), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(mpt::as_byte(0x3f), mpt::as_byte(0x80), mpt::as_byte(0x00), mpt::as_byte(0x00)), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(1.0f), IEEE754binary32LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x80), mpt::as_byte(0x3f)));
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(1.0f), IEEE754binary32BE(mpt::as_byte(0x3f), mpt::as_byte(0x80), mpt::as_byte(0x00), mpt::as_byte(0x00)));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary64(1.0), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary64(-1.0), 0xbff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x4030800000000000ull), 16.5);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3FF5400000000000ull), 1.328125);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0xBFF5400000000000ull), -1.328125);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3ff0000000000000ull), 1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0xbff0000000000000ull), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3ff0000000000000ull), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(1.0).GetInt64(), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(1.0).GetInt64(), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0xf0), mpt::as_byte(0x3f)), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(mpt::as_byte(0x3f), mpt::as_byte(0xf0), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00)), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(1.0), IEEE754binary64LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0xf0), mpt::as_byte(0x3f)));
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(1.0), IEEE754binary64BE(mpt::as_byte(0x3f), mpt::as_byte(0xf0), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00)));
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP

Property changes on: src/mpt/endian/tests/tests_endian_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/tests/tests_endian_integer.hpp
===================================================================
--- src/mpt/endian/tests/tests_endian_integer.hpp	(nonexistent)
+++ src/mpt/endian/tests/tests_endian_integer.hpp	(working copy)
@@ -0,0 +1,118 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP
+#define MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_endian_integer{
+	"mpt/endian/integer",
+	[](mpt::test::context & context) {
+		static_assert(std::numeric_limits<int8le>::min() == std::numeric_limits<int8>::min());
+		static_assert(std::numeric_limits<uint8le>::min() == std::numeric_limits<uint8>::min());
+
+		static_assert(std::numeric_limits<int16le>::min() == std::numeric_limits<int16>::min());
+		static_assert(std::numeric_limits<uint16le>::min() == std::numeric_limits<uint16>::min());
+
+		static_assert(std::numeric_limits<int32le>::min() == std::numeric_limits<int32>::min());
+		static_assert(std::numeric_limits<uint32le>::min() == std::numeric_limits<uint32>::min());
+
+		static_assert(std::numeric_limits<int64le>::min() == std::numeric_limits<int64>::min());
+		static_assert(std::numeric_limits<uint64le>::min() == std::numeric_limits<uint64>::min());
+
+		static_assert(std::numeric_limits<int8le>::max() == std::numeric_limits<int8>::max());
+		static_assert(std::numeric_limits<uint8le>::max() == std::numeric_limits<uint8>::max());
+
+		static_assert(std::numeric_limits<int16le>::max() == std::numeric_limits<int16>::max());
+		static_assert(std::numeric_limits<uint16le>::max() == std::numeric_limits<uint16>::max());
+
+		static_assert(std::numeric_limits<int32le>::max() == std::numeric_limits<int32>::max());
+		static_assert(std::numeric_limits<uint32le>::max() == std::numeric_limits<uint32>::max());
+
+		static_assert(std::numeric_limits<int64le>::max() == std::numeric_limits<int64>::max());
+		static_assert(std::numeric_limits<uint64le>::max() == std::numeric_limits<uint64>::max());
+
+		struct test_endian_constexpr {
+			static MPT_CONSTEXPR20_FUN int32le test(uint32 x) {
+				int32le foo{};
+				foo = x;
+				return foo;
+			}
+		};
+
+		MPT_CONSTEXPR20_VAR int32le foo = test_endian_constexpr::test(23);
+		static_cast<void>(foo);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint8(0x12)), 0x12);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint16(0x1234)), 0x3412);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint32(0x12345678u)), 0x78563412u);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint64(0x123456789abcdef0ull)), 0xf0debc9a78563412ull);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int8(std::numeric_limits<int8>::min())), std::numeric_limits<int8>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int16(std::numeric_limits<int16>::min())), int16(0x80));
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int32(std::numeric_limits<int32>::min())), int32(0x80));
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int64(std::numeric_limits<int64>::min())), int64(0x80));
+
+		// Packed integers with defined endianness
+		{
+			int8le le8;
+			le8.set(-128);
+			int8be be8;
+			be8.set(-128);
+			MPT_TEST_EXPECT_EQUAL(le8, -128);
+			MPT_TEST_EXPECT_EQUAL(be8, -128);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le8, "\x80", 1), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be8, "\x80", 1), 0);
+			int16le le16;
+			le16.set(0x1234);
+			int16be be16;
+			be16.set(0x1234);
+			MPT_TEST_EXPECT_EQUAL(le16, 0x1234);
+			MPT_TEST_EXPECT_EQUAL(be16, 0x1234);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le16, "\x34\x12", 2), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be16, "\x12\x34", 2), 0);
+			uint32le le32;
+			le32.set(0xFFEEDDCCu);
+			uint32be be32;
+			be32.set(0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(le32, 0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(be32, 0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le32, "\xCC\xDD\xEE\xFF", 4), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be32, "\xFF\xEE\xDD\xCC", 4), 0);
+			uint64le le64;
+			le64.set(0xDEADC0DE15C0FFEEull);
+			uint64be be64;
+			be64.set(0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(le64, 0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(be64, 0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le64, "\xEE\xFF\xC0\x15\xDE\xC0\xAD\xDE", 8), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be64, "\xDE\xAD\xC0\xDE\x15\xC0\xFF\xEE", 8), 0);
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP

Property changes on: src/mpt/endian/tests/tests_endian_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/environment/environment.hpp
===================================================================
--- src/mpt/environment/environment.hpp	(nonexistent)
+++ src/mpt/environment/environment.hpp	(working copy)
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENVIRONMENT_ENVIRONMENT_HPP
+#define MPT_ENVIRONMENT_ENVIRONMENT_HPP
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/system_error/system_error.hpp"
+
+#include <optional>
+#if MPT_OS_WINDOWS
+#if defined(UNICODE) && !MPT_OS_WINDOWS_WINRT
+#include <vector>
+#endif // !MPT_OS_WINDOWS_WINRT
+#endif // MPT_OS_WINDOWS
+
+#include <cstdlib>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline std::optional<mpt::ustring> getenv(const mpt::ustring & env_var) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+	MPT_UNUSED(env_var);
+	return std::nullopt;
+#elif MPT_OS_WINDOWS && defined(UNICODE)
+	std::vector<WCHAR> buf(32767);
+	DWORD size = GetEnvironmentVariable(mpt::convert<std::wstring>(env_var).c_str(), buf.data(), 32767);
+	if (size == 0) {
+		mpt::windows::ExpectError(ERROR_ENVVAR_NOT_FOUND);
+		return std::nullopt;
+	}
+	return mpt::convert<mpt::ustring>(buf.data());
+#else
+	const char * val = std::getenv(mpt::convert<std::string>(mpt::environment_encoding, env_var).c_str());
+	if (!val) {
+		return std::nullopt;
+	}
+	return mpt::convert<mpt::ustring>(mpt::environment_encoding, val);
+#endif
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENVIRONMENT_ENVIRONMENT_HPP

Property changes on: src/mpt/environment/environment.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/exception_text/exception_text.hpp
===================================================================
--- src/mpt/exception_text/exception_text.hpp	(nonexistent)
+++ src/mpt/exception_text/exception_text.hpp	(working copy)
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP
+#define MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <exception>
+
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename Tstring>
+inline Tstring get_exception_text(const std::exception & e) {
+	if (e.what() && (std::strlen(e.what()) > 0)) {
+		return mpt::convert<Tstring>(mpt::exception_string{e.what()});
+	} else if (typeid(e).name() && (std::strlen(typeid(e).name()) > 0)) {
+		return mpt::convert<Tstring>(mpt::source_string{typeid(e).name()});
+	} else {
+		return mpt::convert<Tstring>(mpt::source_string{"unknown exception name"});
+	}
+}
+
+template <>
+inline std::string get_exception_text<std::string>(const std::exception & e) {
+	if (e.what() && (std::strlen(e.what()) > 0)) {
+		return std::string{e.what()};
+	} else if (typeid(e).name() && (std::strlen(typeid(e).name()) > 0)) {
+		return std::string{typeid(e).name()};
+	} else {
+		return std::string{"unknown exception name"};
+	}
+}
+
+
+template <typename Tstring>
+inline Tstring get_current_exception_text() {
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		return mpt::get_exception_text<Tstring>(e);
+	} catch (...) {
+		return mpt::convert<Tstring>(mpt::source_string{"unknown exception"});
+	}
+}
+
+template <>
+inline std::string get_current_exception_text<std::string>() {
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		return mpt::get_exception_text<std::string>(e);
+	} catch (...) {
+		return std::string{"unknown exception"};
+	}
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP

Property changes on: src/mpt/exception_text/exception_text.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/json/json.hpp
===================================================================
--- src/mpt/json/json.hpp	(nonexistent)
+++ src/mpt/json/json.hpp	(working copy)
@@ -0,0 +1,80 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_JSON_JSON_HPP
+#define MPT_JSON_JSON_HPP
+
+#include "mpt/base/detect.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#include <optional>
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmismatched-tags"
+#endif // MPT_COMPILER_CLANG
+#include "nlohmann/json.hpp"
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic pop
+#endif // MPT_COMPILER_CLANG
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+
+
+namespace nlohmann {
+template <>
+struct adl_serializer<mpt::ustring> {
+	static void to_json(json & j, const mpt::ustring & val) {
+		j = mpt::convert<std::string>(mpt::common_encoding::utf8, val);
+	}
+	static void from_json(const json & j, mpt::ustring & val) {
+		val = mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, j.get<std::string>());
+	}
+};
+template <typename Tvalue>
+struct adl_serializer<std::map<mpt::ustring, Tvalue>> {
+	static void to_json(json & j, const std::map<mpt::ustring, Tvalue> & val) {
+		std::map<std::string, Tvalue> utf8map;
+		for (const auto & value : val)
+		{
+			utf8map[mpt::convert<std::string>(mpt::common_encoding::utf8, value.first)] = value.second;
+		}
+		j = std::move(utf8map);
+	}
+	static void from_json(const json & j, std::map<mpt::ustring, Tvalue> & val) {
+		std::map<std::string, Tvalue> utf8map = j.get<std::map<std::string, Tvalue>>();
+		std::map<mpt::ustring, Tvalue> result;
+		for (const auto & value : utf8map)
+		{
+			result[mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, value.first)] = value.second;
+		}
+		val = std::move(result);
+	}
+};
+template <typename Tvalue>
+struct adl_serializer<std::optional<Tvalue>> {
+	static void to_json(json & j, const std::optional<Tvalue> & val) {
+		j = (val ? json{*val} : json{nullptr});
+	}
+	static void from_json(const json & j, std::optional<Tvalue> & val) {
+		if (!j.is_null())
+		{
+			val = j.get<Tvalue>();
+		} else
+		{
+			val = std::nullopt;
+		}
+	}
+};
+} // namespace nlohmann
+
+
+
+#endif // MPT_JSON_JSON_HPP

Property changes on: src/mpt/json/json.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/mutex/mutex.hpp
===================================================================
--- src/mpt/mutex/mutex.hpp	(nonexistent)
+++ src/mpt/mutex/mutex.hpp	(working copy)
@@ -0,0 +1,178 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_MUTEX_MUTEX_HPP
+#define MPT_MUTEX_MUTEX_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+
+#if !MPT_PLATFORM_MULTITHREADED
+#define MPT_MUTEX_NONE 1
+#elif MPT_COMPILER_GENERIC
+#define MPT_MUTEX_STD 1
+#elif MPT_OS_WINDOWS && MPT_LIBCXX_GNU && !defined(_GLIBCXX_HAS_GTHREADS) && defined(MPT_WITH_MINGWSTDTHREADS)
+#define MPT_MUTEX_STD 1
+#elif MPT_OS_WINDOWS && MPT_LIBCXX_GNU && !defined(_GLIBCXX_HAS_GTHREADS)
+#define MPT_MUTEX_WIN32 1
+#else
+#define MPT_MUTEX_STD 1
+#endif
+
+#ifndef MPT_MUTEX_STD
+#define MPT_MUTEX_STD 0
+#endif
+#ifndef MPT_MUTEX_WIN32
+#define MPT_MUTEX_WIN32 0
+#endif
+#ifndef MPT_MUTEX_NONE
+#define MPT_MUTEX_NONE 0
+#endif
+
+#if MPT_MUTEX_STD
+#if !MPT_COMPILER_GENERIC && (defined(__MINGW32__) || defined(__MINGW64__)) && !defined(_GLIBCXX_HAS_GTHREADS) && defined(MPT_WITH_MINGWSTDTHREADS)
+#include <mingw.mutex.h>
+#else
+#include <mutex>
+#endif
+#elif MPT_MUTEX_WIN32
+#include <windows.h>
+#endif // MPT_MUTEX
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_MUTEX_STD
+
+using mutex = std::mutex;
+using recursive_mutex = std::recursive_mutex;
+
+#elif MPT_MUTEX_WIN32
+
+// compatible with c++11 std::mutex, can eventually be replaced without touching any usage site
+class mutex {
+private:
+	CRITICAL_SECTION impl;
+
+public:
+	mutex() {
+		InitializeCriticalSection(&impl);
+	}
+	~mutex() {
+		DeleteCriticalSection(&impl);
+	}
+	void lock() {
+		EnterCriticalSection(&impl);
+	}
+	bool try_lock() {
+		return TryEnterCriticalSection(&impl) ? true : false;
+	}
+	void unlock() {
+		LeaveCriticalSection(&impl);
+	}
+};
+
+// compatible with c++11 std::recursive_mutex, can eventually be replaced without touching any usage site
+class recursive_mutex {
+private:
+	CRITICAL_SECTION impl;
+
+public:
+	recursive_mutex() {
+		InitializeCriticalSection(&impl);
+	}
+	~recursive_mutex() {
+		DeleteCriticalSection(&impl);
+	}
+	void lock() {
+		EnterCriticalSection(&impl);
+	}
+	bool try_lock() {
+		return TryEnterCriticalSection(&impl) ? true : false;
+	}
+	void unlock() {
+		LeaveCriticalSection(&impl);
+	}
+};
+
+#else // MPT_MUTEX_NONE
+
+class mutex {
+public:
+	mutex() {
+		return;
+	}
+	~mutex() {
+		return;
+	}
+	void lock() {
+		return;
+	}
+	bool try_lock() {
+		return true;
+	}
+	void unlock() {
+		return;
+	}
+};
+
+class recursive_mutex {
+public:
+	recursive_mutex() {
+		return;
+	}
+	~recursive_mutex() {
+		return;
+	}
+	void lock() {
+		return;
+	}
+	bool try_lock() {
+		return true;
+	}
+	void unlock() {
+		return;
+	}
+};
+
+#endif // MPT_MUTEX
+
+#if MPT_MUTEX_STD
+
+template <typename T>
+using lock_guard = std::lock_guard<T>;
+
+#else // !MPT_MUTEX_STD
+
+// compatible with c++11 std::lock_guard, can eventually be replaced without touching any usage site
+template <typename mutex_type>
+class lock_guard {
+private:
+	mutex_type & mutex;
+
+public:
+	lock_guard(mutex_type & m)
+		: mutex(m) {
+		mutex.lock();
+	}
+	~lock_guard() {
+		mutex.unlock();
+	}
+};
+
+#endif // MPT_MUTEX_STD
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_MUTEX_MUTEX_HPP

Property changes on: src/mpt/mutex/mutex.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/osinfo/windows_version.hpp
===================================================================
--- src/mpt/osinfo/windows_version.hpp	(nonexistent)
+++ src/mpt/osinfo/windows_version.hpp	(working copy)
@@ -0,0 +1,347 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_OSINFO_WINDOWS_VERSION_HPP
+#define MPT_OSINFO_WINDOWS_VERSION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace osinfo {
+
+namespace windows {
+
+
+
+class Version {
+
+public:
+	enum Number : uint64
+	{
+		WinNT4 = 0x0000000400000000ull,
+		Win2000 = 0x0000000500000000ull,
+		WinXP = 0x0000000500000001ull,
+		WinXP64 = 0x0000000500000002ull,
+		WinVista = 0x0000000600000000ull,
+		Win7 = 0x0000000600000001ull,
+		Win8 = 0x0000000600000002ull,
+		Win81 = 0x0000000600000003ull,
+		Win10 = 0x0000000a00000000ull,
+		WinNewer = Win10 + 1ull
+	};
+
+	struct System {
+		uint32 Major = 0;
+		uint32 Minor = 0;
+		System() = default;
+		constexpr System(Number number) noexcept
+			: Major(static_cast<uint32>((static_cast<uint64>(number) >> 32) & 0xffffffffu))
+			, Minor(static_cast<uint32>((static_cast<uint64>(number) >> 0) & 0xffffffffu)) {
+		}
+		explicit constexpr System(uint64 number) noexcept
+			: Major(static_cast<uint32>((number >> 32) & 0xffffffffu))
+			, Minor(static_cast<uint32>((number >> 0) & 0xffffffffu)) {
+		}
+		explicit constexpr System(uint32 major, uint32 minor) noexcept
+			: Major(major)
+			, Minor(minor) {
+		}
+		constexpr operator uint64() const noexcept {
+			return (static_cast<uint64>(Major) << 32) | (static_cast<uint64>(Minor) << 0);
+		}
+	};
+
+	struct ServicePack {
+		uint16 Major = 0;
+		uint16 Minor = 0;
+		ServicePack() = default;
+		explicit constexpr ServicePack(uint16 major, uint16 minor) noexcept
+			: Major(major)
+			, Minor(minor) {
+		}
+		constexpr bool HasServicePack() const noexcept {
+			return Major != 0 || Minor != 0;
+		}
+		constexpr operator uint32() const noexcept {
+			return (static_cast<uint32>(Major) << 16) | (static_cast<uint32>(Minor) << 0);
+		}
+	};
+
+	typedef uint32 Build;
+
+	typedef uint32 TypeId;
+
+protected:
+	bool m_SystemIsWindows;
+
+	System m_System;
+	ServicePack m_ServicePack;
+	Build m_Build;
+	TypeId m_Type;
+
+protected:
+	Version() noexcept
+		: m_SystemIsWindows(false)
+		, m_System()
+		, m_ServicePack()
+		, m_Build()
+		, m_Type() {
+	}
+
+public:
+	static Version NoWindows() noexcept {
+		return Version();
+	}
+
+	Version(mpt::osinfo::windows::Version::System system, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build, mpt::osinfo::windows::Version::TypeId type) noexcept
+		: m_SystemIsWindows(true)
+		, m_System(system)
+		, m_ServicePack(servicePack)
+		, m_Build(build)
+		, m_Type(type) {
+	}
+
+protected:
+#if MPT_OS_WINDOWS
+
+	static mpt::osinfo::windows::Version VersionFromNTDDI_VERSION() noexcept {
+		// Initialize to used SDK version
+		mpt::osinfo::windows::Version::System System =
+#if NTDDI_VERSION >= 0x0A000000 // NTDDI_WIN10
+			mpt::osinfo::windows::Version::Win10
+#elif NTDDI_VERSION >= 0x06030000 // NTDDI_WINBLUE
+			mpt::osinfo::windows::Version::Win81
+#elif NTDDI_VERSION >= 0x06020000 // NTDDI_WIN8
+			mpt::osinfo::windows::Version::Win8
+#elif NTDDI_VERSION >= 0x06010000 // NTDDI_WIN7
+			mpt::osinfo::windows::Version::Win7
+#elif NTDDI_VERSION >= 0x06000000 // NTDDI_VISTA
+			mpt::osinfo::windows::Version::WinVista
+#elif NTDDI_VERSION >= 0x05020000 // NTDDI_WS03
+			mpt::osinfo::windows::Version::WinXP64
+#elif NTDDI_VERSION >= NTDDI_WINXP
+			mpt::osinfo::windows::Version::WinXP
+#elif NTDDI_VERSION >= NTDDI_WIN2K
+			mpt::osinfo::windows::Version::Win2000
+#else
+			mpt::osinfo::windows::Version::WinNT4
+#endif
+			;
+		return mpt::osinfo::windows::Version(System, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
+	}
+
+	static mpt::osinfo::windows::Version::System SystemVersionFrom_WIN32_WINNT() noexcept {
+#if defined(_WIN32_WINNT)
+		return mpt::osinfo::windows::Version::System((static_cast<uint64>(_WIN32_WINNT) & 0xff00u) >> 8, (static_cast<uint64>(_WIN32_WINNT) & 0x00ffu) >> 0);
+#else
+		return mpt::osinfo::windows::Version::System();
+#endif
+	}
+
+	static mpt::osinfo::windows::Version GatherWindowsVersion() noexcept {
+#if MPT_OS_WINDOWS_WINRT
+		return VersionFromNTDDI_VERSION();
+#else // !MPT_OS_WINDOWS_WINRT
+		OSVERSIONINFOEXW versioninfoex{};
+		versioninfoex.dwOSVersionInfoSize = sizeof(versioninfoex);
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4996)  // 'GetVersionExW': was declared deprecated
+#pragma warning(disable : 28159) // Consider using 'IsWindows*' instead of 'GetVersionExW'. Reason: Deprecated. Use VerifyVersionInfo* or IsWindows* macros from VersionHelpers.
+#endif                           // MPT_COMPILER_MSVC
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif // MPT_COMPILER_CLANG
+		if (GetVersionExW((LPOSVERSIONINFOW)&versioninfoex) == FALSE) {
+			return VersionFromNTDDI_VERSION();
+		}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic pop
+#endif                       // MPT_COMPILER_CLANG
+		if (versioninfoex.dwPlatformId != VER_PLATFORM_WIN32_NT) {
+			return VersionFromNTDDI_VERSION();
+		}
+		DWORD dwProductType = 0;
+#if (_WIN32_WINNT >= 0x0600) // _WIN32_WINNT_VISTA
+		dwProductType = PRODUCT_UNDEFINED;
+		if (GetProductInfo(versioninfoex.dwMajorVersion, versioninfoex.dwMinorVersion, versioninfoex.wServicePackMajor, versioninfoex.wServicePackMinor, &dwProductType) == FALSE) {
+			dwProductType = PRODUCT_UNDEFINED;
+		}
+#endif
+		return mpt::osinfo::windows::Version(
+			mpt::osinfo::windows::Version::System(versioninfoex.dwMajorVersion, versioninfoex.dwMinorVersion),
+			mpt::osinfo::windows::Version::ServicePack(versioninfoex.wServicePackMajor, versioninfoex.wServicePackMinor),
+			versioninfoex.dwBuildNumber,
+			dwProductType);
+#endif // MPT_OS_WINDOWS_WINRT
+	}
+
+#endif // MPT_OS_WINDOWS
+
+public:
+	static mpt::osinfo::windows::Version Current() noexcept {
+#if MPT_OS_WINDOWS
+		return GatherWindowsVersion();
+#else  // !MPT_OS_WINDOWS
+		return mpt::osinfo::windows::Version::NoWindows();
+#endif // MPT_OS_WINDOWS
+	}
+
+public:
+	bool IsWindows() const noexcept {
+		return m_SystemIsWindows;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		return m_System < version;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		return m_ServicePack < servicePack;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		return m_Build < build;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		if (m_ServicePack > servicePack) {
+			return false;
+		}
+		if (m_ServicePack < servicePack) {
+			return true;
+		}
+		return m_Build < build;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		return m_System >= version;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		return m_ServicePack >= servicePack;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		return m_Build >= build;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		if (m_ServicePack < servicePack) {
+			return false;
+		}
+		if (m_ServicePack > servicePack) {
+			return true;
+		}
+		return m_Build >= build;
+	}
+
+	mpt::osinfo::windows::Version::System GetSystem() const noexcept {
+		return m_System;
+	}
+
+	mpt::osinfo::windows::Version::ServicePack GetServicePack() const noexcept {
+		return m_ServicePack;
+	}
+
+	mpt::osinfo::windows::Version::Build GetBuild() const noexcept {
+		return m_Build;
+	}
+
+	mpt::osinfo::windows::Version::TypeId GetTypeId() const noexcept {
+		return m_Type;
+	}
+
+}; // class Version
+
+
+
+} // namespace windows
+
+} // namespace osinfo
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_OSINFO_WINDOWS_VERSION_HPP

Property changes on: src/mpt/osinfo/windows_version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/out_of_memory/out_of_memory.hpp
===================================================================
--- src/mpt/out_of_memory/out_of_memory.hpp	(nonexistent)
+++ src/mpt/out_of_memory/out_of_memory.hpp	(working copy)
@@ -0,0 +1,77 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP
+#define MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <exception>
+#if !MPT_DETECTED_MFC
+#include <new>
+#endif // !MPT_DETECTED_MFC
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Exception handling helpers, because MFC requires explicit deletion of the exception object,
+// Thus, always call exactly one of mpt::rethrow_out_of_memory(e) or mpt::delete_out_of_memory(e).
+
+#if MPT_DETECTED_MFC
+
+using out_of_memory = CMemoryException *;
+
+[[noreturn]] inline void throw_out_of_memory() {
+	AfxThrowMemoryException();
+}
+
+[[noreturn]] inline void rethrow_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+	throw;
+}
+
+inline void delete_out_of_memory(out_of_memory & e) {
+	if (e) {
+		e->Delete();
+		e = nullptr;
+	}
+}
+
+#else // !MPT_DETECTED_MFC
+
+using out_of_memory = const std::bad_alloc &;
+
+[[noreturn]] inline void throw_out_of_memory() {
+	throw std::bad_alloc();
+}
+
+[[noreturn]] inline void rethrow_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+	throw;
+}
+
+inline void delete_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+}
+
+#endif // MPT_DETECTED_MFC
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP

Property changes on: src/mpt/out_of_memory/out_of_memory.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/crand.hpp
===================================================================
--- src/mpt/random/crand.hpp	(nonexistent)
+++ src/mpt/random/crand.hpp	(working copy)
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_CRAND_HPP
+#define MPT_RANDOM_CRAND_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/numeric.hpp"
+#include "mpt/random/random.hpp"
+
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class crand {
+public:
+	using state_type = void;
+	using result_type = int;
+
+private:
+	static void reseed(uint32 seed) {
+		std::srand(seed);
+	}
+
+public:
+	template <typename Trd>
+	static void reseed(Trd & rd) {
+		reseed(mpt::random<uint32>(rd));
+	}
+
+public:
+	crand() = default;
+	explicit crand(const std::string &) {
+		return;
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return 0;
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return RAND_MAX;
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return mpt::lower_bound_entropy_bits(RAND_MAX);
+	}
+	result_type operator()() {
+		return std::rand();
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_CRAND_HPP

Property changes on: src/mpt/random/crand.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/default_engines.hpp
===================================================================
--- src/mpt/random/default_engines.hpp	(nonexistent)
+++ src/mpt/random/default_engines.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_DEFAULT_ENGINES_HPP
+#define MPT_RANDOM_DEFAULT_ENGINES_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/engine.hpp"
+#include "mpt/random/engine_lcg.hpp"
+
+#include <random>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+using deterministic_fast_engine = mpt::lcg_msvc;
+using deterministic_good_engine = mpt::lcg_musl;
+
+// We cannot use std::minstd_rand here because it has not a power-of-2 sized
+// output domain which we rely upon.
+using fast_engine = mpt::lcg_msvc; // about 3 ALU operations, ~32bit of state, suited for inner loops
+using good_engine = std::ranlux48;
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_DEFAULT_ENGINES_HPP

Property changes on: src/mpt/random/default_engines.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/device.hpp
===================================================================
--- src/mpt/random/device.hpp	(nonexistent)
+++ src/mpt/random/device.hpp	(working copy)
@@ -0,0 +1,303 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_DEVICE_HPP
+#define MPT_RANDOM_DEVICE_HPP
+
+
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/crc/crc.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/mutex/mutex.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/random/engine.hpp"
+#include "mpt/random/engine_lcg.hpp"
+#include "mpt/random/random.hpp"
+
+#include <chrono>
+#include <limits>
+#include <memory>
+#include <random>
+#include <string>
+
+#include <cmath>
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+inline constexpr uint32 DETERMINISTIC_RNG_SEED = 3141592653u; // pi
+
+
+
+template <typename T>
+struct default_radom_seed_hash {
+};
+
+template <>
+struct default_radom_seed_hash<uint8> {
+	using type = mpt::crc16;
+};
+
+template <>
+struct default_radom_seed_hash<uint16> {
+	using type = mpt::crc16;
+};
+
+template <>
+struct default_radom_seed_hash<uint32> {
+	using type = mpt::crc32c;
+};
+
+template <>
+struct default_radom_seed_hash<uint64> {
+	using type = mpt::crc64_jones;
+};
+
+
+class prng_random_device_time_seeder {
+
+public:
+	template <typename T>
+	inline T generate_seed() {
+		// Note: CRC is actually not that good a choice here, but it is simple and we
+		// already have an implementaion available. Better choices for mixing entropy
+		// would be a hash function with proper avalanche characteristics or a block
+		// or stream cipher with any pre-choosen random key and IV. The only aspect we
+		// really need here is whitening of the bits.
+		typename mpt::default_radom_seed_hash<T>::type hash;
+
+		{
+			uint64be time;
+			time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock().now().time_since_epoch()).count();
+			std::byte bytes[sizeof(time)];
+			std::memcpy(bytes, &time, sizeof(time));
+			hash(std::begin(bytes), std::end(bytes));
+		}
+#if !defined(MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK)
+		// Avoid std::chrono::high_resolution_clock on Emscripten because availability is problematic in AudioWorklet context.
+		{
+			uint64be time;
+			time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock().now().time_since_epoch()).count();
+			std::byte bytes[sizeof(time)];
+			std::memcpy(bytes, &time, sizeof(time));
+			hash(std::begin(bytes), std::end(bytes));
+		}
+#endif // !MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK
+
+		return static_cast<T>(hash.result());
+	}
+
+public:
+	prng_random_device_time_seeder() = default;
+};
+
+
+//  C++11 std::random_device may be implemented as a deterministic PRNG.
+//  There is no way to seed this PRNG and it is allowed to be seeded with the
+// same value on each program invocation. This makes std::random_device
+// completely useless even as a non-cryptographic entropy pool.
+//  We fallback to time-seeded std::mt19937 if std::random_device::entropy() is
+// 0 or less.
+class sane_random_device {
+private:
+	mpt::mutex m;
+	std::string token;
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+	std::unique_ptr<std::random_device> prd;
+	bool rd_reliable{false};
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	std::unique_ptr<std::mt19937> rd_fallback;
+
+public:
+	using result_type = unsigned int;
+
+private:
+	void init_fallback() {
+		if (!rd_fallback) {
+			if (token.length() > 0) {
+				uint64 seed_val = mpt::prng_random_device_time_seeder().generate_seed<uint64>();
+				std::vector<unsigned int> seeds;
+				seeds.push_back(static_cast<uint32>(seed_val >> 32));
+				seeds.push_back(static_cast<uint32>(seed_val >> 0));
+				for (std::size_t i = 0; i < token.length(); ++i) {
+					seeds.push_back(static_cast<unsigned int>(static_cast<unsigned char>(token[i])));
+				}
+				std::seed_seq seed(seeds.begin(), seeds.end());
+				rd_fallback = std::make_unique<std::mt19937>(seed);
+			} else {
+				uint64 seed_val = mpt::prng_random_device_time_seeder().generate_seed<uint64>();
+				unsigned int seeds[2];
+				seeds[0] = static_cast<uint32>(seed_val >> 32);
+				seeds[1] = static_cast<uint32>(seed_val >> 0);
+				std::seed_seq seed(seeds + 0, seeds + 2);
+				rd_fallback = std::make_unique<std::mt19937>(seed);
+			}
+		}
+	}
+
+public:
+	sane_random_device() {
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		try {
+			prd = std::make_unique<std::random_device>();
+			rd_reliable = ((*prd).entropy() > 0.0);
+		} catch (mpt::out_of_memory e) {
+			mpt::rethrow_out_of_memory(e);
+		} catch (const std::exception &) {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			init_fallback();
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		init_fallback();
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	}
+	sane_random_device(const std::string & token_)
+		: token(token_) {
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		try {
+			prd = std::make_unique<std::random_device>(token);
+			rd_reliable = ((*prd).entropy() > 0.0);
+		} catch (mpt::out_of_memory e) {
+			mpt::rethrow_out_of_memory(e);
+		} catch (const std::exception &) {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			init_fallback();
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		init_fallback();
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	}
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return std::numeric_limits<result_type>::min();
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return std::numeric_limits<result_type>::max();
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return sizeof(result_type) * 8;
+	}
+	result_type operator()() {
+		mpt::lock_guard<mpt::mutex> l(m);
+		result_type result = 0;
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		if (prd) {
+			try {
+				if constexpr (std::random_device::min() != 0 || !mpt::is_mask(std::random_device::max())) {
+					// insane std::random_device
+					//  This implementation is not exactly uniformly distributed but good enough
+					// for OpenMPT.
+					constexpr double rd_min = static_cast<double>(std::random_device::min());
+					constexpr double rd_max = static_cast<double>(std::random_device::max());
+					constexpr double rd_range = rd_max - rd_min;
+					constexpr double rd_size = rd_range + 1.0;
+					const double rd_entropy = std::log2(rd_size);
+					const int iterations = static_cast<int>(std::ceil(result_bits() / rd_entropy));
+					double tmp = 0.0;
+					for (int i = 0; i < iterations; ++i) {
+						tmp = (tmp * rd_size) + (static_cast<double>((*prd)()) - rd_min);
+					}
+					double result_01 = std::floor(tmp / std::pow(rd_size, iterations));
+					result = static_cast<result_type>(std::floor(result_01 * (static_cast<double>(max() - min()) + 1.0))) + min();
+				} else {
+					// sane std::random_device
+					result = 0;
+					std::size_t rd_bits = mpt::lower_bound_entropy_bits(std::random_device::max());
+					for (std::size_t entropy = 0; entropy < (sizeof(result_type) * 8); entropy += rd_bits) {
+						if (rd_bits < (sizeof(result_type) * 8)) {
+							result = (result << rd_bits) | static_cast<result_type>((*prd)());
+						} else {
+							result = result | static_cast<result_type>((*prd)());
+						}
+					}
+				}
+			} catch (const std::exception &) {
+				rd_reliable = false;
+				init_fallback();
+			}
+		} else {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			// std::random_device is unreliable
+			//  XOR the generated random number with more entropy from the time-seeded
+			// PRNG.
+			//  Note: This is safe even if the std::random_device itself is implemented
+			// as a std::mt19937 PRNG because we are very likely using a different
+			// seed.
+			result ^= mpt::random<result_type>(*rd_fallback);
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		result ^= mpt::random<result_type>(*rd_fallback);
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		return result;
+	}
+};
+
+
+class prng_random_device_deterministic_seeder {
+protected:
+	template <typename T>
+	constexpr T generate_seed() noexcept {
+		return static_cast<T>(mpt::DETERMINISTIC_RNG_SEED);
+	}
+
+protected:
+	prng_random_device_deterministic_seeder() = default;
+};
+
+template <typename Trng = mpt::lcg_musl, typename seeder = mpt::prng_random_device_time_seeder>
+class prng_random_device
+	: private seeder {
+public:
+	using result_type = unsigned int;
+
+private:
+	mpt::mutex m;
+	Trng rng;
+
+public:
+	prng_random_device()
+		: rng(seeder::template generate_seed<typename Trng::state_type>()) {
+		return;
+	}
+	prng_random_device(const std::string &)
+		: rng(seeder::template generate_seed<typename Trng::state_type>()) {
+		return;
+	}
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return std::numeric_limits<unsigned int>::min();
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return std::numeric_limits<unsigned int>::max();
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return sizeof(unsigned int) * 8;
+	}
+	result_type operator()() {
+		mpt::lock_guard<mpt::mutex> l(m);
+		return mpt::random<unsigned int>(rng);
+	}
+};
+
+
+using deterministc_random_device = mpt::prng_random_device<mpt::lcg_musl>;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_DEVICE_HPP

Property changes on: src/mpt/random/device.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/engine.hpp
===================================================================
--- src/mpt/random/engine.hpp	(nonexistent)
+++ src/mpt/random/engine.hpp	(working copy)
@@ -0,0 +1,166 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_ENGINE_HPP
+#define MPT_RANDOM_ENGINE_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/seed.hpp"
+
+#include <memory>
+#include <random>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Trng>
+struct engine_traits {
+	typedef typename Trng::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return Trng::result_bits();
+	}
+	template <typename Trd>
+	static inline Trng make(Trd & rd) {
+		return Trng(rd);
+	}
+};
+
+// C++11 random does not provide any sane way to determine the amount of entropy
+// required to seed a particular engine. VERY STUPID.
+// List the ones we are likely to use.
+
+template <>
+struct engine_traits<std::mt19937> {
+	enum : std::size_t
+	{
+		seed_bits = sizeof(std::mt19937::result_type) * 8 * std::mt19937::state_size
+	};
+	typedef std::mt19937 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		std::unique_ptr<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>> values = std::make_unique<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>>(rd);
+		std::seed_seq seed(values->begin(), values->end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::mt19937_64> {
+	enum : std::size_t
+	{
+		seed_bits = sizeof(std::mt19937_64::result_type) * 8 * std::mt19937_64::state_size
+	};
+	typedef std::mt19937_64 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		std::unique_ptr<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>> values = std::make_unique<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>>(rd);
+		std::seed_seq seed(values->begin(), values->end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux24_base> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux24_base::word_size
+	};
+	typedef std::ranlux24_base rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux48_base> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux48_base::word_size
+	};
+	typedef std::ranlux48_base rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux24> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux24_base::word_size
+	};
+	typedef std::ranlux24 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return std::ranlux24_base::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux48> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux48_base::word_size
+	};
+	typedef std::ranlux48 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return std::ranlux48_base::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+
+
+template <typename Trng, typename Trd>
+inline Trng make_prng(Trd & rd) {
+	return mpt::engine_traits<Trng>::make(rd);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_ENGINE_HPP

Property changes on: src/mpt/random/engine.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/engine_lcg.hpp
===================================================================
--- src/mpt/random/engine_lcg.hpp	(nonexistent)
+++ src/mpt/random/engine_lcg.hpp	(working copy)
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_ENGINE_LCG_HPP
+#define MPT_RANDOM_ENGINE_LCG_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/random.hpp"
+
+#include <random>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4724) // potential mod by 0
+#endif                          // MPT_COMPILER_MSVC
+
+template <typename Tstate, typename Tvalue, Tstate m, Tstate a, Tstate c, Tstate result_mask, int result_shift, int result_bits_>
+class lcg_engine {
+public:
+	typedef Tstate state_type;
+	typedef Tvalue result_type;
+
+private:
+	state_type state;
+
+public:
+	template <typename Trng>
+	explicit inline lcg_engine(Trng & rd)
+		: state(mpt::random<state_type>(rd)) {
+		operator()(); // we return results from the current state and update state after returning. results in better pipelining.
+	}
+	explicit inline lcg_engine(state_type seed)
+		: state(seed) {
+		operator()(); // we return results from the current state and update state after returning. results in better pipelining.
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return static_cast<result_type>(0);
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		static_assert(((result_mask >> result_shift) << result_shift) == result_mask);
+		return static_cast<result_type>(result_mask >> result_shift);
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		static_assert(((static_cast<Tstate>(1) << result_bits_) - 1) == (result_mask >> result_shift));
+		return result_bits_;
+	}
+	inline result_type operator()() {
+		// we return results from the current state and update state after returning. results in better pipelining.
+		state_type s = state;
+		result_type result = static_cast<result_type>((s & result_mask) >> result_shift);
+		s = mpt::modulo_if_not_zero<state_type, m>((a * s) + c);
+		state = s;
+		return result;
+	}
+};
+
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+
+typedef lcg_engine<uint32, uint16, 0u, 214013u, 2531011u, 0x7fff0000u, 16, 15> lcg_msvc;
+typedef lcg_engine<uint32, uint16, 0x80000000u, 1103515245u, 12345u, 0x7fff0000u, 16, 15> lcg_c99;
+typedef lcg_engine<uint64, uint32, 0ull, 6364136223846793005ull, 1ull, 0xffffffff00000000ull, 32, 32> lcg_musl;
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_ENGINE_LCG_HPP

Property changes on: src/mpt/random/engine_lcg.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/random.hpp
===================================================================
--- src/mpt/random/random.hpp	(nonexistent)
+++ src/mpt/random/random.hpp	(working copy)
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_RANDOM_HPP
+#define MPT_RANDOM_RANDOM_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/engine.hpp"
+
+#include <type_traits>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T, typename Trng>
+inline T random(Trng & rng) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < (sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	return static_cast<T>(result);
+}
+
+template <typename T, std::size_t required_entropy_bits, typename Trng>
+inline T random(Trng & rng) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < std::min(required_entropy_bits, sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	if constexpr (required_entropy_bits >= (sizeof(T) * 8)) {
+		return static_cast<T>(result);
+	} else {
+		return static_cast<T>(result & ((static_cast<unsigned_T>(1) << required_entropy_bits) - static_cast<unsigned_T>(1)));
+	}
+}
+
+template <typename T, typename Trng>
+inline T random(Trng & rng, std::size_t required_entropy_bits) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < std::min(required_entropy_bits, sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	if (required_entropy_bits >= (sizeof(T) * 8)) {
+		return static_cast<T>(result);
+	} else {
+		return static_cast<T>(result & ((static_cast<unsigned_T>(1) << required_entropy_bits) - static_cast<unsigned_T>(1)));
+	}
+}
+
+template <typename T>
+struct uniform_real_distribution {
+private:
+	T a;
+	T b;
+
+public:
+	inline uniform_real_distribution(T a_, T b_)
+		: a(a_)
+		, b(b_) {
+		return;
+	}
+	template <typename Trng>
+	inline T operator()(Trng & rng) const {
+		const int mantissa_bits = std::numeric_limits<T>::digits;
+		return ((b - a) * static_cast<T>(mpt::random<uint64, mantissa_bits>(rng)) / static_cast<T>((static_cast<uint64>(1u) << mantissa_bits))) + a;
+	}
+};
+
+
+template <typename T, typename Trng>
+inline T random(Trng & rng, T min, T max) {
+	static_assert(!std::numeric_limits<T>::is_integer);
+	typedef mpt::uniform_real_distribution<T> dis_type;
+	dis_type dis(min, max);
+	return static_cast<T>(dis(rng));
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_RANDOM_HPP

Property changes on: src/mpt/random/random.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/seed.hpp
===================================================================
--- src/mpt/random/seed.hpp	(nonexistent)
+++ src/mpt/random/seed.hpp	(working copy)
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_SEED_HPP
+#define MPT_RANDOM_SEED_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <std::size_t N>
+class seed_seq_values {
+private:
+	std::array<unsigned int, N> seeds;
+
+public:
+	template <typename Trd>
+	explicit seed_seq_values(Trd & rd) {
+		for (std::size_t i = 0; i < N; ++i) {
+			seeds[i] = rd();
+		}
+	}
+	const unsigned int * begin() const {
+		return seeds.data();
+	}
+	const unsigned int * end() const {
+		return seeds.data() + N;
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_SEED_HPP

Property changes on: src/mpt/random/seed.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/tests/tests_random.hpp
===================================================================
--- src/mpt/random/tests/tests_random.hpp	(nonexistent)
+++ src/mpt/random/tests/tests_random.hpp	(working copy)
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_RANDOM_HPP
+#define MPT_BASE_TESTS_RANDOM_HPP
+
+
+
+#include "mpt/base/algorithm.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/random/random.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_random{
+	"mpt/random",
+	[](mpt::test::context & context) {
+		mpt::sane_random_device rd;
+		mpt::good_engine prng = mpt::make_prng<mpt::good_engine>(rd);
+
+		bool failed = false;
+
+		for (std::size_t i = 0; i < 10000; ++i) {
+
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 7>(prng), 0u, 127u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 8>(prng), 0u, 255u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 9>(prng), 0u, 511u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint64, 1>(prng), 0u, 1u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 7), 0u, 127u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 8), 0u, 255u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 9), 0u, 511u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint64>(prng, 1), 0u, 1u);
+
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 7>(prng), 0, 127);
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 8>(prng), 0, 255);
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 9>(prng), 0, 511);
+			failed = failed || !mpt::is_in_range(mpt::random<int64, 1>(prng), 0, 1);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 7), 0, 127);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 8), 0, 255);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 9), 0, 511);
+			failed = failed || !mpt::is_in_range(mpt::random<int64>(prng, 1), 0, 1);
+
+			failed = failed || !mpt::is_in_range(mpt::random<float>(prng, 0.0f, 1.0f), 0.0f, 1.0f);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 0.0, 1.0), 0.0, 1.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 1.0), -1.0, 1.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 0.0), -1.0, 0.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 1.0, 2.0), 1.0, 2.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 1.0, 3.0), 1.0, 3.0);
+		}
+
+		MPT_TEST_EXPECT_EXPR(!failed);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_RANDOM_HPP

Property changes on: src/mpt/random/tests/tests_random.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/buffer.hpp
===================================================================
--- src/mpt/string/buffer.hpp	(nonexistent)
+++ src/mpt/string/buffer.hpp	(working copy)
@@ -0,0 +1,344 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_BUFFER_HPP
+#define MPT_STRING_BUFFER_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/types.hpp"
+
+#include <algorithm>
+#include <array>
+#include <string>
+#include <string_view>
+#include <type_traits>
+
+#include <cassert>
+#include <cstddef>
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+
+template <typename Tstring, typename Tchar>
+class StringBufRefImpl {
+private:
+	Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit StringBufRefImpl(Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		static_assert(sizeof(Tchar) == sizeof(typename Tstring::value_type));
+		assert(size > 0);
+	}
+	StringBufRefImpl(const StringBufRefImpl &) = delete;
+	StringBufRefImpl(StringBufRefImpl &&) = default;
+	StringBufRefImpl & operator=(const StringBufRefImpl &) = delete;
+	StringBufRefImpl & operator=(StringBufRefImpl &&) = delete;
+	operator Tstring() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return Tstring(buf, buf + len);
+	}
+	explicit operator std::basic_string_view<Tchar>() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return std::basic_string_view<Tchar>(buf, buf + len);
+	}
+	bool empty() const {
+		return buf[0] == Tchar('\0');
+	}
+	StringBufRefImpl & operator=(const Tstring & str) {
+		std::copy(str.data(), str.data() + std::min(str.length(), size - 1), buf);
+		std::fill(buf + std::min(str.length(), size - 1), buf + size, Tchar('\0'));
+		return *this;
+	}
+};
+
+template <typename Tstring, typename Tchar>
+class StringBufRefImpl<Tstring, const Tchar> {
+private:
+	const Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit StringBufRefImpl(const Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		static_assert(sizeof(Tchar) == sizeof(typename Tstring::value_type));
+		assert(size > 0);
+	}
+	StringBufRefImpl(const StringBufRefImpl &) = delete;
+	StringBufRefImpl(StringBufRefImpl &&) = default;
+	StringBufRefImpl & operator=(const StringBufRefImpl &) = delete;
+	StringBufRefImpl & operator=(StringBufRefImpl &&) = delete;
+	operator Tstring() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return Tstring(buf, buf + len);
+	}
+	explicit operator std::basic_string_view<Tchar>() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return std::basic_string_view<Tchar>(buf, len);
+	}
+	bool empty() const {
+		return buf[0] == Tchar('\0');
+	}
+};
+
+
+
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tstring, typename Tchar>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<Tstring, Tchar>(buf.data(), size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<Tstring, Tchar>(buf, size);
+}
+template <typename Tstring, typename Tchar>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<Tstring, Tchar>(buf, size);
+}
+
+
+
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf, size);
+}
+
+
+
+#if MPT_OS_WINDOWS
+
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf, size);
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_DETECTED_MFC
+
+template <typename Tchar>
+class CStringBufRefImpl {
+private:
+	Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit CStringBufRefImpl(Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		assert(size > 0);
+	}
+	CStringBufRefImpl(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl(CStringBufRefImpl &&) = default;
+	CStringBufRefImpl & operator=(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl & operator=(CStringBufRefImpl &&) = delete;
+	operator CString() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return CString(buf, mpt::saturate_cast<int>(len));
+	}
+	CStringBufRefImpl & operator=(const CString & str) {
+		std::copy(str.GetString(), str.GetString() + std::min(static_cast<std::size_t>(str.GetLength()), size - 1), buf);
+		std::fill(buf + std::min(static_cast<std::size_t>(str.GetLength()), size - 1), buf + size, Tchar('\0'));
+		return *this;
+	}
+};
+
+template <typename Tchar>
+class CStringBufRefImpl<const Tchar> {
+private:
+	const Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit CStringBufRefImpl(const Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		assert(size > 0);
+	}
+	CStringBufRefImpl(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl(CStringBufRefImpl &&) = default;
+	CStringBufRefImpl & operator=(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl & operator=(CStringBufRefImpl &&) = delete;
+	operator CString() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return CString(buf, mpt::saturate_cast<int>(len));
+	}
+};
+
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const std::array<Tchar, size> & buf) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const Tchar (&buf)[size]) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const Tchar * buf, std::size_t size) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(std::array<Tchar, size> & buf) {
+	return CStringBufRefImpl<Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(Tchar (&buf)[size]) {
+	return CStringBufRefImpl<Tchar>(buf, size);
+}
+template <typename Tchar>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(Tchar * buf, std::size_t size) {
+	return CStringBufRefImpl<Tchar>(buf, size);
+}
+
+#endif // MPT_DETECTED_MFC
+
+
+
+template <std::size_t len>
+struct charbuf {
+public:
+	using Tchar = char;
+	using char_type = Tchar;
+	using string_type = std::basic_string<Tchar>;
+	using string_view_type = std::basic_string_view<Tchar>;
+	constexpr std::size_t static_length() const {
+		return len;
+	}
+
+public:
+	Tchar buf[len];
+
+public:
+	charbuf() {
+		std::fill(std::begin(buf), std::end(buf), Tchar('\0'));
+	}
+	charbuf(const charbuf &) = default;
+	charbuf(charbuf &&) = default;
+	charbuf & operator=(const charbuf &) = default;
+	charbuf & operator=(charbuf &&) = default;
+	const Tchar & operator[](std::size_t i) const {
+		return buf[i];
+	}
+	std::string str() const {
+		return static_cast<std::string>(*this);
+	}
+	operator string_type() const {
+		return mpt::ReadAutoBuf(buf);
+	}
+	explicit operator string_view_type() const {
+		return static_cast<string_view_type>(mpt::ReadAutoBuf(buf));
+	}
+	bool empty() const {
+		return mpt::ReadAutoBuf(buf).empty();
+	}
+	charbuf & operator=(const string_type & str) {
+		mpt::WriteAutoBuf(buf) = str;
+		return *this;
+	}
+
+public:
+	friend bool operator!=(const charbuf & a, const charbuf & b) {
+		return static_cast<string_view_type>(a) != static_cast<string_view_type>(b);
+	}
+	friend bool operator!=(const std::string & a, const charbuf & b) {
+		return a != static_cast<string_view_type>(b);
+	}
+	friend bool operator!=(const charbuf & a, const std::string & b) {
+		return static_cast<string_view_type>(a) != b;
+	}
+	friend bool operator==(const charbuf & a, const charbuf & b) {
+		return static_cast<string_view_type>(a) == static_cast<string_view_type>(b);
+	}
+	friend bool operator==(const std::string & a, const charbuf & b) {
+		return a == static_cast<string_view_type>(b);
+	}
+	friend bool operator==(const charbuf & a, const std::string & b) {
+		return static_cast<string_view_type>(a) == b;
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_BUFFER_HPP

Property changes on: src/mpt/string/buffer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/convert.hpp
===================================================================
--- src/mpt/string/convert.hpp	(nonexistent)
+++ src/mpt/string/convert.hpp	(working copy)
@@ -0,0 +1,1131 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_CONVERT_HPP
+#define MPT_STRING_CONVERT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#include <locale>
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#include <stdexcept>
+#include <string>
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#include <type_traits>
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#include <vector>
+
+#if MPT_OS_DJGPP
+#include <cstring>
+#endif // MPT_OS_DJGPP
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_DJGPP
+#include <dpmi.h>
+#endif // MPT_OS_DJGPP
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+/*
+default 1:1 mapping
+inline constexpr char32_t CharsetTableISO8859_1[256] = {
+	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
+	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
+	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
+	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
+	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
+	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
+	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
+	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
+	0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f,
+	0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f,
+	0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
+	0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf,
+	0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
+	0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
+	0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
+	0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
+};
+*/
+
+inline constexpr char32_t CharsetTableISO8859_15[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+	0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+	0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+	0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+	0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
+	0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+	0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+	0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+	0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
+
+inline constexpr char32_t CharsetTableWindows1252[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+	0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f,
+	0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178,
+	0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+	0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+	0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+	0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+	0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+	0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
+
+inline constexpr char32_t CharsetTableCP850[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+	0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+	0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00F8, 0x00a3, 0x00D8, 0x00D7, 0x0192,
+	0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x00AE, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00A2, 0x00A5, 0x2510,
+	0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00E3, 0x00C3, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00A4,
+	0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250c, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580,
+	0x00D3, 0x00df, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00b5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4,
+	0x00AD, 0x00b1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00f7, 0x00B8, 0x00b0, 0x00A8, 0x00b7, 0x00B9, 0x00B3, 0x00b2, 0x25a0, 0x00a0};
+
+inline constexpr char32_t CharsetTableCP437[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+	0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+	0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
+	0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
+	0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
+	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
+	0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229,
+	0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0};
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_8bit(const Tsrcstring & str, const char32_t (&table)[256], mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		std::size_t c = static_cast<std::size_t>(mpt::char_value(str[i]));
+		if (c < std::size(table)) {
+			res.push_back(static_cast<mpt::widechar>(table[c]));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_8bit(const mpt::widestring & str, const char32_t (&table)[256], char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		bool found = false;
+		// Try non-control characters first.
+		// In cases where there are actual characters mirrored in this range (like in AMS/AMS2 character sets),
+		// characters in the common range are preferred this way.
+		for (std::size_t x = 0x20; x < std::size(table); ++x) {
+			if (c == table[x]) {
+				res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
+				found = true;
+				break;
+			}
+		}
+		if (!found) {
+			// try control characters
+			for (std::size_t x = 0x00; x < std::size(table) && x < 0x20; ++x) {
+				if (c == table[x]) {
+					res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
+					found = true;
+					break;
+				}
+			}
+		}
+		if (!found) {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_ascii(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		uint8 c = str[i];
+		if (c <= 0x7f) {
+			res.push_back(static_cast<mpt::widechar>(static_cast<uint32>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_ascii(const mpt::widestring & str, char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		if (c <= 0x7f) {
+			res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_iso8859_1(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	MPT_UNUSED(replacement);
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		uint8 c = str[i];
+		res.push_back(static_cast<mpt::widechar>(static_cast<uint32>(c)));
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_iso8859_1(const mpt::widestring & str, char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		if (c <= 0xff) {
+			res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_utf8(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	const Tsrcstring & in = str;
+	mpt::widestring out;
+	// state:
+	std::size_t charsleft = 0;
+	char32_t ucs4 = 0;
+	for (uint8 c : in) {
+		if (charsleft == 0) {
+			if ((c & 0x80) == 0x00) {
+				out.push_back(static_cast<mpt::widechar>(c));
+			} else if ((c & 0xE0) == 0xC0) {
+				ucs4 = c & 0x1F;
+				charsleft = 1;
+			} else if ((c & 0xF0) == 0xE0) {
+				ucs4 = c & 0x0F;
+				charsleft = 2;
+			} else if ((c & 0xF8) == 0xF0) {
+				ucs4 = c & 0x07;
+				charsleft = 3;
+			} else {
+				out.push_back(replacement);
+				ucs4 = 0;
+				charsleft = 0;
+			}
+		} else {
+			if ((c & 0xC0) != 0x80) {
+				out.push_back(replacement);
+				ucs4 = 0;
+				charsleft = 0;
+			}
+			ucs4 <<= 6;
+			ucs4 |= c & 0x3F;
+			charsleft--;
+			if (charsleft == 0) {
+				if constexpr (sizeof(mpt::widechar) == 2) {
+					if (ucs4 > 0x1fffff) {
+						out.push_back(replacement);
+						ucs4 = 0;
+						charsleft = 0;
+					}
+					if (ucs4 <= 0xffff) {
+						out.push_back(static_cast<mpt::widechar>(ucs4));
+					} else {
+						uint32 surrogate = static_cast<uint32>(ucs4) - 0x10000;
+						uint16 hi_sur = static_cast<uint16>((0x36 << 10) | ((surrogate >> 10) & ((1 << 10) - 1)));
+						uint16 lo_sur = static_cast<uint16>((0x37 << 10) | ((surrogate >> 0) & ((1 << 10) - 1)));
+						out.push_back(hi_sur);
+						out.push_back(lo_sur);
+					}
+				} else {
+					out.push_back(static_cast<mpt::widechar>(ucs4));
+				}
+				ucs4 = 0;
+			}
+		}
+	}
+	if (charsleft != 0) {
+		out.push_back(replacement);
+		ucs4 = 0;
+		charsleft = 0;
+	}
+	return out;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_utf8(const mpt::widestring & str, char replacement = '?') {
+	const mpt::widestring & in = str;
+	Tdststring out;
+	for (std::size_t i = 0; i < in.length(); i++) {
+		mpt::widechar wc = in[i];
+		char32_t ucs4 = 0;
+		if constexpr (sizeof(mpt::widechar) == 2) {
+			uint16 c = static_cast<uint16>(wc);
+			if (i + 1 < in.length()) {
+				// check for surrogate pair
+				uint16 hi_sur = in[i + 0];
+				uint16 lo_sur = in[i + 1];
+				if (hi_sur >> 10 == 0x36 && lo_sur >> 10 == 0x37) {
+					// surrogate pair
+					++i;
+					hi_sur &= (1 << 10) - 1;
+					lo_sur &= (1 << 10) - 1;
+					ucs4 = (static_cast<uint32>(hi_sur) << 10) | (static_cast<uint32>(lo_sur) << 0);
+				} else {
+					// no surrogate pair
+					ucs4 = static_cast<char32_t>(c);
+				}
+			} else {
+				// no surrogate possible
+				ucs4 = static_cast<char32_t>(c);
+			}
+		} else {
+			ucs4 = static_cast<char32_t>(wc);
+		}
+		if (ucs4 > 0x1fffff) {
+			out.push_back(replacement);
+			continue;
+		}
+		uint8 utf8[6];
+		std::size_t numchars = 0;
+		for (numchars = 0; numchars < 6; numchars++) {
+			utf8[numchars] = ucs4 & 0x3F;
+			ucs4 >>= 6;
+			if (ucs4 == 0) {
+				break;
+			}
+		}
+		numchars++;
+		if (numchars == 1) {
+			out.push_back(utf8[0]);
+			continue;
+		}
+		if (numchars == 2 && utf8[numchars - 1] == 0x01) {
+			// generate shortest form
+			out.push_back(utf8[0] | 0x40);
+			continue;
+		}
+		std::size_t charsleft = numchars;
+		while (charsleft > 0) {
+			if (charsleft == numchars) {
+				out.push_back(utf8[charsleft - 1] | (((1 << numchars) - 1) << (8 - numchars)));
+			} else {
+				// cppcheck false-positive
+				// cppcheck-suppress arrayIndexOutOfBounds
+				out.push_back(utf8[charsleft - 1] | 0x80);
+			}
+			charsleft--;
+		}
+	}
+	return out;
+}
+
+
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring utf32_from_utf16(const Tsrcstring & in, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == 2);
+	static_assert(sizeof(typename Tdststring::value_type) == 4);
+	MPT_UNUSED(replacement);
+	Tdststring out;
+	out.reserve(in.length());
+	for (std::size_t i = 0; i < in.length(); i++) {
+		char16_t wc = static_cast<char16_t>(static_cast<uint16>(in[i]));
+		char32_t ucs4 = 0;
+		uint16 c = static_cast<uint16>(wc);
+		if (i + 1 < in.length()) {
+			// check for surrogate pair
+			uint16 hi_sur = in[i + 0];
+			uint16 lo_sur = in[i + 1];
+			if (hi_sur >> 10 == 0x36 && lo_sur >> 10 == 0x37) {
+				// surrogate pair
+				++i;
+				hi_sur &= (1 << 10) - 1;
+				lo_sur &= (1 << 10) - 1;
+				ucs4 = (static_cast<uint32>(hi_sur) << 10) | (static_cast<uint32>(lo_sur) << 0);
+			} else {
+				// no surrogate pair
+				ucs4 = static_cast<char32_t>(c);
+			}
+		} else {
+			// no surrogate possible
+			ucs4 = static_cast<char32_t>(c);
+		}
+		out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint32>(ucs4)));
+	}
+	return out;
+}
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring utf16_from_utf32(const Tsrcstring & in, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == 4);
+	static_assert(sizeof(typename Tdststring::value_type) == 2);
+	Tdststring out;
+	out.reserve(in.length());
+	for (std::size_t i = 0; i < in.length(); i++) {
+		char32_t ucs4 = static_cast<char32_t>(static_cast<uint32>(in[i]));
+		if (ucs4 > 0x1fffff) {
+			out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint16>(replacement)));
+			ucs4 = 0;
+		}
+		if (ucs4 <= 0xffff) {
+			out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint16>(ucs4)));
+		} else {
+			uint32 surrogate = static_cast<uint32>(ucs4) - 0x10000;
+			uint16 hi_sur = static_cast<uint16>((0x36 << 10) | ((surrogate >> 10) & ((1 << 10) - 1)));
+			uint16 lo_sur = static_cast<uint16>((0x37 << 10) | ((surrogate >> 0) & ((1 << 10) - 1)));
+			out.push_back(static_cast<typename Tdststring::value_type>(hi_sur));
+			out.push_back(static_cast<typename Tdststring::value_type>(lo_sur));
+		}
+	}
+	return out;
+}
+
+
+
+#if MPT_OS_WINDOWS
+
+inline bool has_codepage(UINT cp) {
+	return IsValidCodePage(cp) ? true : false;
+}
+
+inline bool windows_has_encoding(common_encoding encoding) {
+	bool result = false;
+	switch (encoding) {
+		case common_encoding::utf8:
+			result = has_codepage(CP_UTF8);
+			break;
+		case common_encoding::ascii:
+			result = has_codepage(20127);
+			break;
+		case common_encoding::iso8859_1:
+			result = has_codepage(28591);
+			break;
+		case common_encoding::iso8859_15:
+			result = has_codepage(28605);
+			break;
+		case common_encoding::cp850:
+			result = has_codepage(850);
+			break;
+		case common_encoding::cp437:
+			result = has_codepage(437);
+			break;
+		case common_encoding::windows1252:
+			result = has_codepage(1252);
+			break;
+	}
+	return result;
+}
+
+inline bool windows_has_encoding(logical_encoding encoding) {
+	bool result = false;
+	switch (encoding) {
+		case logical_encoding::locale:
+			result = true;
+			break;
+		case logical_encoding::active_locale:
+			result = false;
+			break;
+	}
+	return result;
+}
+
+inline UINT codepage_from_encoding(logical_encoding encoding) {
+	UINT result = 0;
+	switch (encoding) {
+		case logical_encoding::locale:
+			result = CP_ACP;
+			break;
+		case logical_encoding::active_locale:
+			result = 0;
+			break;
+	}
+	return result;
+}
+
+inline UINT codepage_from_encoding(common_encoding encoding) {
+	UINT result = 0;
+	switch (encoding) {
+		case common_encoding::utf8:
+			result = CP_UTF8;
+			break;
+		case common_encoding::ascii:
+			result = 20127;
+			break;
+		case common_encoding::iso8859_1:
+			result = 28591;
+			break;
+		case common_encoding::iso8859_15:
+			result = 28605;
+			break;
+		case common_encoding::cp850:
+			result = 850;
+			break;
+		case common_encoding::cp437:
+			result = 437;
+			break;
+		case common_encoding::windows1252:
+			result = 1252;
+			break;
+	}
+	return result;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_codepage(UINT codepage, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	Tdststring encoded_string;
+	int required_size = WideCharToMultiByte(codepage, 0, src.data(), mpt::saturate_cast<int>(src.size()), nullptr, 0, nullptr, nullptr);
+	if (required_size > 0) {
+		encoded_string.resize(required_size);
+		WideCharToMultiByte(codepage, 0, src.data(), mpt::saturate_cast<int>(src.size()), reinterpret_cast<CHAR *>(encoded_string.data()), required_size, nullptr, nullptr);
+	}
+	return encoded_string;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_codepage(UINT codepage, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	mpt::widestring decoded_string;
+	int required_size = MultiByteToWideChar(codepage, 0, reinterpret_cast<const CHAR *>(src.data()), mpt::saturate_cast<int>(src.size()), nullptr, 0);
+	if (required_size > 0) {
+		decoded_string.resize(required_size);
+		MultiByteToWideChar(codepage, 0, reinterpret_cast<const CHAR *>(src.data()), mpt::saturate_cast<int>(src.size()), decoded_string.data(), required_size);
+	}
+	return decoded_string;
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_OS_DJGPP
+
+inline common_encoding djgpp_get_locale_encoding() {
+	uint16 active_codepage = 437;
+	uint16 system_codepage = 437;
+	__dpmi_regs regs;
+	std::memset(&regs, 0, sizeof(__dpmi_regs));
+	regs.x.ax = 0x6601;
+	if (__dpmi_int(0x21, &regs) == 0) {
+		int cf = (regs.x.flags >> 0) & 1;
+		if (cf == 0) {
+			active_codepage = regs.x.bx;
+			system_codepage = regs.x.dx;
+		}
+	}
+	common_encoding result = common_encoding::cp437;
+	if (active_codepage == 0) {
+		result = common_encoding::cp437;
+	} else if (active_codepage == 437) {
+		result = common_encoding::cp437;
+	} else if (active_codepage == 850) {
+		result = common_encoding::cp850;
+	} else if (system_codepage == 437) {
+		result = common_encoding::cp437;
+	} else if (system_codepage == 850) {
+		result = common_encoding::cp850;
+	} else {
+		result = common_encoding::cp437;
+	}
+	return result;
+}
+
+#endif // MPT_OS_DJGPP
+
+
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+
+// Note:
+//
+//  std::codecvt::out in LLVM libc++ does not advance in and out pointers when
+// running into a non-convertible character. This can happen when no locale is
+// set on FreeBSD or MacOSX. This behaviour violates the C++ standard.
+//
+//  We apply the following (albeit costly, even on other platforms) work-around:
+//  If the conversion errors out and does not advance the pointers at all, we
+// retry the conversion with a space character prepended to the string. If it
+// still does error out, we retry the whole conversion character by character.
+//  This is costly even on other platforms in one single case: The first
+// character is an invalid Unicode code point or otherwise not convertible. Any
+// following non-convertible characters are not a problem.
+
+inline std::wstring decode_locale_impl(const std::string & str, const std::locale & locale, wchar_t replacement = L'\uFFFD', int retry = 0, bool * progress = nullptr) {
+	if (str.empty()) {
+		return std::wstring();
+	}
+	std::vector<wchar_t> out;
+	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
+	std::mbstate_t state = std::mbstate_t();
+	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
+	codecvt_type::result result = codecvt_type::partial;
+	const char * in_begin = str.data();
+	const char * in_end = in_begin + str.size();
+	out.resize((in_end - in_begin) * (mpt::saturate_cast<std::size_t>(facet.max_length()) + 1));
+	wchar_t * out_begin = out.data();
+	wchar_t * out_end = out.data() + out.size();
+	const char * in_next = nullptr;
+	wchar_t * out_next = nullptr;
+	do {
+		if (retry == 2) {
+			for (;;) {
+				in_next = nullptr;
+				out_next = nullptr;
+				result = facet.in(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
+				if (result == codecvt_type::partial && in_next == in_begin + 1) {
+					in_begin = in_next;
+					out_begin = out_next;
+					continue;
+				} else {
+					break;
+				}
+			}
+		} else {
+			in_next = nullptr;
+			out_next = nullptr;
+			result = facet.in(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
+		}
+		if (result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end)) {
+			out.resize(out.size() * 2);
+			in_begin = in_next;
+			out_begin = out.data() + (out_next - out_begin);
+			out_end = out.data() + out.size();
+			continue;
+		}
+		if (retry == 0) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				bool made_progress = true;
+				decode_locale_impl(std::string(" ") + str, locale, replacement, 1, &made_progress);
+				if (!made_progress) {
+					return decode_locale_impl(str, locale, replacement, 2);
+				}
+			}
+		} else if (retry == 1) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				*progress = false;
+			} else {
+				*progress = true;
+			}
+			return std::wstring();
+		}
+		if (result == codecvt_type::error) {
+			++in_next;
+			*out_next = replacement;
+			++out_next;
+		}
+		in_begin = in_next;
+		out_begin = out_next;
+	} while ((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
+	return std::wstring(out.data(), out_next);
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_locale(const std::locale & locale, const Tsrcstring & src) {
+	if constexpr (std::is_same<Tsrcstring, std::string>::value) {
+		return decode_locale_impl(src, locale);
+	} else {
+		return decode_locale_impl(std::string(src.begin(), src.end()), locale);
+	}
+}
+
+inline std::string encode_locale_impl(const std::wstring & str, const std::locale & locale, char replacement = '?', int retry = 0, bool * progress = nullptr) {
+	if (str.empty()) {
+		return std::string();
+	}
+	std::vector<char> out;
+	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
+	std::mbstate_t state = std::mbstate_t();
+	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
+	codecvt_type::result result = codecvt_type::partial;
+	const wchar_t * in_begin = str.data();
+	const wchar_t * in_end = in_begin + str.size();
+	out.resize((in_end - in_begin) * (mpt::saturate_cast<std::size_t>(facet.max_length()) + 1));
+	char * out_begin = out.data();
+	char * out_end = out.data() + out.size();
+	const wchar_t * in_next = nullptr;
+	char * out_next = nullptr;
+	do {
+		if (retry == 2) {
+			for (;;) {
+				in_next = nullptr;
+				out_next = nullptr;
+				result = facet.out(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
+				if (result == codecvt_type::partial && in_next == in_begin + 1) {
+					in_begin = in_next;
+					out_begin = out_next;
+					continue;
+				} else {
+					break;
+				}
+			}
+		} else {
+			in_next = nullptr;
+			out_next = nullptr;
+			result = facet.out(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
+		}
+		if (result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end)) {
+			out.resize(out.size() * 2);
+			in_begin = in_next;
+			out_begin = out.data() + (out_next - out_begin);
+			out_end = out.data() + out.size();
+			continue;
+		}
+		if (retry == 0) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				bool made_progress = true;
+				encode_locale_impl(std::wstring(L" ") + str, locale, replacement, 1, &made_progress);
+				if (!made_progress) {
+					return encode_locale_impl(str, locale, replacement, 2);
+				}
+			}
+		} else if (retry == 1) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				*progress = false;
+			} else {
+				*progress = true;
+			}
+			return std::string();
+		}
+		if (result == codecvt_type::error) {
+			++in_next;
+			*out_next = replacement;
+			++out_next;
+		}
+		in_begin = in_next;
+		out_begin = out_next;
+	} while ((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
+	return std::string(out.data(), out_next);
+}
+
+template <typename Tdststring>
+inline Tdststring encode_locale(const std::locale & locale, const mpt::widestring & src) {
+	if constexpr (std::is_same<Tdststring, std::string>::value) {
+		return encode_locale_impl(src, locale);
+	} else {
+		const std::string tmp = encode_locale_impl(src, locale);
+		return Tdststring(tmp.begin(), tmp.end());
+	}
+}
+
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+
+#if MPT_OS_WINDOWS
+template <typename Tdststring>
+inline Tdststring encode(UINT codepage, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_codepage<Tdststring>(codepage, src);
+}
+#endif // MPT_OS_WINDOWS
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <typename Tdststring>
+inline Tdststring encode(const std::locale & locale, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_locale<Tdststring>(src, locale);
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+template <typename Tdststring>
+inline Tdststring encode(const char32_t (&table)[256], const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_8bit<Tdststring>(src, table);
+}
+
+template <typename Tdststring>
+inline Tdststring encode(common_encoding encoding, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return encode_codepage<Tdststring>(codepage_from_encoding(encoding), src);
+	}
+#endif
+	switch (encoding) {
+		case common_encoding::utf8:
+			return encode_utf8<Tdststring>(src);
+			break;
+		case common_encoding::ascii:
+			return encode_ascii<Tdststring>(src);
+			break;
+		case common_encoding::iso8859_1:
+			return encode_iso8859_1<Tdststring>(src);
+			break;
+		case common_encoding::iso8859_15:
+			return encode_8bit<Tdststring>(src, CharsetTableISO8859_15);
+			break;
+		case common_encoding::cp437:
+			return encode_8bit<Tdststring>(src, CharsetTableCP437);
+			break;
+		case common_encoding::cp850:
+			return encode_8bit<Tdststring>(src, CharsetTableCP850);
+			break;
+		case common_encoding::windows1252:
+			return encode_8bit<Tdststring>(src, CharsetTableWindows1252);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+}
+
+template <typename Tdststring>
+inline Tdststring encode(logical_encoding encoding, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return encode_codepage<Tdststring>(codepage_from_encoding(encoding), src);
+	}
+#endif
+#if MPT_OS_DJGPP
+	switch (encoding) {
+		case logical_encoding::locale:
+			return encode<Tdststring>(djgpp_get_locale_encoding(), src);
+			break;
+		case logical_encoding::active_locale:
+			return encode<Tdststring>(djgpp_get_locale_encoding(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#elif !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+	switch (encoding) {
+		case logical_encoding::locale:
+			return encode_locale<Tdststring>(std::locale(""), src);
+			break;
+		case logical_encoding::active_locale:
+			return encode_locale<Tdststring>(std::locale(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#else
+	throw std::domain_error("unsupported encoding");
+#endif
+}
+
+#if MPT_OS_WINDOWS
+template <typename Tsrcstring>
+inline mpt::widestring decode(UINT codepage, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_codepage(codepage, src);
+}
+#endif // MPT_OS_WINDOWS
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <typename Tsrcstring>
+inline mpt::widestring decode(const std::locale & locale, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_locale(src, locale);
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(const char32_t (&table)[256], const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_8bit(src, table);
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(common_encoding encoding, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return decode_codepage(codepage_from_encoding(encoding), src);
+	}
+#endif
+	switch (encoding) {
+		case common_encoding::utf8:
+			return decode_utf8(src);
+			break;
+		case common_encoding::ascii:
+			return decode_ascii(src);
+			break;
+		case common_encoding::iso8859_1:
+			return decode_iso8859_1(src);
+			break;
+		case common_encoding::iso8859_15:
+			return decode_8bit(src, CharsetTableISO8859_15);
+			break;
+		case common_encoding::cp437:
+			return decode_8bit(src, CharsetTableCP437);
+			break;
+		case common_encoding::cp850:
+			return decode_8bit(src, CharsetTableCP850);
+			break;
+		case common_encoding::windows1252:
+			return decode_8bit(src, CharsetTableWindows1252);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(logical_encoding encoding, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return decode_codepage(codepage_from_encoding(encoding), src);
+	}
+#endif
+#if MPT_OS_DJGPP
+	switch (encoding) {
+		case logical_encoding::locale:
+			return decode(djgpp_get_locale_encoding(), src);
+			break;
+		case logical_encoding::active_locale:
+			return decode(djgpp_get_locale_encoding(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#elif !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+	switch (encoding) {
+		case logical_encoding::locale:
+			return decode_locale(std::locale(""), src);
+			break;
+		case logical_encoding::active_locale:
+			return decode_locale(std::locale(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#else
+	throw std::domain_error("unsupported encoding");
+#endif
+}
+
+
+
+inline bool is_utf8(const std::string & str) {
+	return (str == encode<std::string>(common_encoding::utf8, decode<std::string>(common_encoding::utf8, str)));
+}
+
+
+
+template <typename Tstring>
+struct string_converter {
+};
+
+template <logical_encoding encoding>
+struct string_converter<std::basic_string<char, logical_encoding_char_traits<encoding>>> {
+	using string_type = std::basic_string<char, logical_encoding_char_traits<encoding>>;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(encoding, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(encoding, src);
+	}
+};
+
+template <common_encoding encoding>
+struct string_converter<std::basic_string<char, common_encoding_char_traits<encoding>>> {
+	using string_type = std::basic_string<char, common_encoding_char_traits<encoding>>;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(encoding, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(encoding, src);
+	}
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct string_converter<std::wstring> {
+	using string_type = std::wstring;
+	static inline mpt::widestring decode(const string_type & src) {
+		return src;
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src;
+	}
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct string_converter<std::u8string> {
+	using string_type = std::u8string;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(common_encoding::utf8, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(common_encoding::utf8, src);
+	}
+};
+#endif // C++10
+
+template <>
+struct string_converter<std::u16string> {
+	using string_type = std::u16string;
+	static inline mpt::widestring decode(const string_type & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char16_t)) {
+			return mpt::widestring(src.begin(), src.end());
+		} else {
+			return utf32_from_utf16<mpt::widestring, std::u16string>(src);
+		}
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char16_t)) {
+			return string_type(src.begin(), src.end());
+		} else {
+			return utf16_from_utf32<std::u16string, mpt::widestring>(src);
+		}
+	}
+};
+
+#if defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct string_converter<std::u32string> {
+	using string_type = std::u32string;
+	static inline mpt::widestring decode(const string_type & src) {
+		return src;
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src;
+	}
+};
+#else  // !MPT_COMPILER_QUIRK_NO_WCHAR
+template <>
+struct string_converter<std::u32string> {
+	using string_type = std::u32string;
+	static inline mpt::widestring decode(const string_type & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char32_t)) {
+			return mpt::widestring(src.begin(), src.end());
+		} else {
+			return utf16_from_utf32<mpt::widestring, std::u32string>(src);
+		}
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char32_t)) {
+			return string_type(src.begin(), src.end());
+		} else {
+			return utf32_from_utf16<std::u32string, mpt::widestring>(src);
+		}
+	}
+};
+#endif // MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct string_converter<CStringW> {
+	using string_type = CStringW;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::widestring(src.GetString());
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src.c_str();
+	}
+};
+
+template <>
+struct string_converter<CStringA> {
+	using string_type = CStringA;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<std::string>(mpt::logical_encoding::locale, std::string(src.GetString()));
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<std::string>(mpt::logical_encoding::locale, src).c_str();
+	}
+};
+
+#endif // MPT_DETECTED_MFC
+
+template <typename Tdststring, typename Tsrcstring, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(const Tsrcstring & src) {
+	if constexpr (std::is_same<Tdststring, typename mpt::make_string_type<Tsrcstring>::type>::value) {
+		return mpt::as_string(src);
+	} else {
+		return string_converter<Tdststring>::encode(string_converter<decltype(mpt::as_string(src))>::decode(mpt::as_string(src)));
+	}
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tencoding, std::enable_if_t<std::is_same<Tdststring, std::string>::value, bool> = true, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tencoding to, const Tsrcstring & src) {
+	return mpt::encode<Tdststring>(to, string_converter<decltype(mpt::as_string(src))>::decode(mpt::as_string(src)));
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tencoding, std::enable_if_t<std::is_same<typename mpt::make_string_type<Tsrcstring>::type, std::string>::value, bool> = true, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tencoding from, const Tsrcstring & src) {
+	return string_converter<Tdststring>::encode(mpt::decode<decltype(mpt::as_string(src))>(from, mpt::as_string(src)));
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tto, typename Tfrom, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tto to, Tfrom from, const Tsrcstring & src) {
+	return mpt::encode<Tdststring>(to, mpt::decode<decltype(mpt::as_string(src))>(from, mpt::as_string(src)));
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_CONVERT_HPP

Property changes on: src/mpt/string/convert.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/convert_macros.hpp
===================================================================
--- src/mpt/string/convert_macros.hpp	(nonexistent)
+++ src/mpt/string/convert_macros.hpp	(working copy)
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_CONVERT_MACROS_HPP
+#define MPT_STRING_CONVERT_MACROS_HPP
+
+
+
+#include "mpt/string/types.hpp"
+#include "mpt/string/convert.hpp"
+
+#include <string>
+
+
+
+// The MPT_UTF8_STRING allows specifying UTF8 char arrays.
+// The resulting type is mpt::ustring and the construction might require runtime translation,
+// i.e. it is NOT generally available at compile time.
+// Use explicit UTF8 encoding,
+// i.e. U+00FC (LATIN SMALL LETTER U WITH DIAERESIS) would be written as "\xC3\xBC".
+#define MPT_UTF8_STRING(x) mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, std::string{x})
+
+
+
+#endif // MPT_STRING_CONVERT_MACROS_HPP

Property changes on: src/mpt/string/convert_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_floatingpoint.hpp
===================================================================
--- src/mpt/string/format_default_floatingpoint.hpp	(nonexistent)
+++ src/mpt/string/format_default_floatingpoint.hpp	(working copy)
@@ -0,0 +1,91 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP
+#define MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+
+#if MPT_MSVC_AT_LEAST(2019, 4) || MPT_GCC_AT_LEAST(11, 1, 0)
+#define MPT_FORMAT_CXX17_FLOAT 1
+#else
+#define MPT_FORMAT_CXX17_FLOAT 0
+#endif
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include "mpt/base/algorithm.hpp"
+#endif
+#include "mpt/string/convert.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include <charconv>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <iomanip>
+#include <ios>
+#include <limits>
+#include <locale>
+#include <sstream>
+#endif
+#include <string>
+#if MPT_FORMAT_CXX17_FLOAT
+#include <system_error>
+#endif
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_FORMAT_CXX17_FLOAT
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring to_chars_string(const T & x) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_chars_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+#endif
+
+
+#if !MPT_FORMAT_CXX17_FLOAT
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring to_stream_string(const T & x) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	s << std::setprecision(std::numeric_limits<T>::max_digits10) << x;
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_stream_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+#endif
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP

Property changes on: src/mpt/string/format_default_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_formatter.hpp
===================================================================
--- src/mpt/string/format_default_formatter.hpp	(nonexistent)
+++ src/mpt/string/format_default_formatter.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP
+#define MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_default_floatingpoint.hpp"
+#include "mpt/string/format_default_integer.hpp"
+#include "mpt/string/format_default_string.hpp"
+
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+struct default_formatter {
+	template <typename Tstring, typename T>
+	static inline Tstring format(const T & value) {
+		using namespace mpt;
+		return format_value_default<Tstring>(value);
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP

Property changes on: src/mpt/string/format_default_formatter.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_integer.hpp
===================================================================
--- src/mpt/string/format_default_integer.hpp	(nonexistent)
+++ src/mpt/string/format_default_integer.hpp	(working copy)
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP
+#define MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP
+
+
+#include "mpt/base/detect.hpp"
+
+#if 1
+#define MPT_FORMAT_CXX17_INT 1
+#else
+#define MPT_FORMAT_CXX17_INT 0
+#endif
+
+#if MPT_FORMAT_CXX17_INT
+#include "mpt/base/algorithm.hpp"
+#endif // MPT_FORMAT_CXX17_INT
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/format_helpers.hpp"
+
+#if MPT_FORMAT_CXX17_INT
+#include <charconv>
+#endif // MPT_FORMAT_CXX17_INT
+#if !MPT_FORMAT_CXX17_INT
+#include <ios>
+#include <locale>
+#include <sstream>
+#endif // !MPT_FORMAT_CXX17_INT
+#include <string>
+#if MPT_FORMAT_CXX17_INT
+#include <system_error>
+#endif // MPT_FORMAT_CXX17_INT
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_FORMAT_CXX17_INT
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring to_chars_string(const T & x) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		if constexpr (std::is_same<T, bool>::value) {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), static_cast<int>(x));
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		} else {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_chars_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+
+#endif // MPT_FORMAT_CXX17_INT
+
+
+#if !MPT_FORMAT_CXX17_INT
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring to_stream_string(const T & x) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	if constexpr (std::is_same<T, bool>::value) {
+		s << static_cast<int>(x);
+	} else if constexpr (mpt::is_character<T>::value) {
+		s << (x + 0); // force integral promotion
+	} else {
+		s << x;
+	}
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_stream_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+
+#endif // !MPT_FORMAT_CXX17_INT
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP

Property changes on: src/mpt/string/format_default_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_string.hpp
===================================================================
--- src/mpt/string/format_default_string.hpp	(nonexistent)
+++ src/mpt/string/format_default_string.hpp	(working copy)
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_STRING_HPP
+#define MPT_STRING_FORMAT_DEFAULT_STRING_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tstring, typename T>
+inline auto format_value_default(const T & x) -> decltype(mpt::convert<Tstring>(x)) {
+	return mpt::convert<Tstring>(x);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_STRING_HPP

Property changes on: src/mpt/string/format_default_string.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_helpers.hpp
===================================================================
--- src/mpt/string/format_helpers.hpp	(nonexistent)
+++ src/mpt/string/format_helpers.hpp	(working copy)
@@ -0,0 +1,106 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_HELPERS_HPP
+#define MPT_STRING_FORMAT_HELPERS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <string>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring convert_formatted_simple(const Tsrcstring & src) {
+	if constexpr (std::is_same<Tdststring, Tsrcstring>::value) {
+		return src;
+	} else {
+		Tdststring dst;
+		dst.reserve(src.length());
+		for (std::size_t i = 0; i < src.length(); ++i) {
+			dst.push_back(mpt::unsafe_char_convert<typename Tdststring::value_type>(src[i]));
+		}
+		return dst;
+	}
+}
+
+
+template <typename Tchar>
+struct select_format_char_type {
+	using type = char;
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct select_format_char_type<wchar_t> {
+	using type = wchar_t;
+};
+#if MPT_USTRING_MODE_WIDE
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct select_format_char_type<char8_t> {
+	using type = wchar_t;
+};
+#endif // C++20
+template <>
+struct select_format_char_type<char16_t> {
+	using type = wchar_t;
+};
+template <>
+struct select_format_char_type<char32_t> {
+	using type = wchar_t;
+};
+#endif // MPT_USTRING_MODE_WIDE
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+template <typename Tstring>
+struct select_format_string_type {
+	using type = mpt::ustring;
+};
+
+template <>
+struct select_format_string_type<std::string> {
+	using type = std::string;
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct select_format_string_type<std::wstring> {
+	using type = std::wstring;
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct select_format_string_type<std::u8string> {
+	using type = std::u8string;
+};
+#endif // C++20
+
+template <>
+struct select_format_string_type<std::u16string> {
+	using type = std::u16string;
+};
+
+template <>
+struct select_format_string_type<std::u32string> {
+	using type = std::u32string;
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_HELPERS_HPP

Property changes on: src/mpt/string/format_helpers.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_message.hpp
===================================================================
--- src/mpt/string/format_message.hpp	(nonexistent)
+++ src/mpt/string/format_message.hpp	(working copy)
@@ -0,0 +1,334 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_MESSAGE_HPP
+#define MPT_STRING_FORMAT_MESSAGE_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <utility>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class format_message_syntax_error
+	: public std::domain_error {
+public:
+	format_message_syntax_error()
+		: std::domain_error("format string syntax error") {
+		return;
+	}
+};
+
+template <typename Tformatter, typename Tformat>
+class message_formatter {
+
+public:
+	using Tstring = typename mpt::make_string_type<Tformat>::type;
+
+private:
+	Tstring format;
+
+private:
+	MPT_NOINLINE Tstring do_format(const mpt::span<const Tstring> vals) const {
+		using traits = typename mpt::string_traits<Tstring>;
+		using char_type = typename traits::char_type;
+		using size_type = typename traits::size_type;
+		Tstring result;
+		const size_type len = traits::length(format);
+		traits::reserve(result, len);
+		std::size_t max_arg = 0;
+		std::size_t args = 0;
+		bool success = true;
+		enum class state : int
+		{
+			error = -1,
+			text = 0,
+			open_seen = 1,
+			number_seen = 2,
+			close_seen = 3,
+		};
+		state state = state::text;
+		bool numbered_args = false;
+		bool unnumbered_args = false;
+		std::size_t last_arg = 0;
+		std::size_t this_arg = 0;
+		std::size_t current_arg = 0;
+		for (size_type pos = 0; pos != len; ++pos) {
+			char_type c = format[pos];
+			switch (state) {
+				case state::text:
+					if (c == char_type('{')) {
+						state = state::open_seen;
+					} else if (c == char_type('}')) {
+						state = state::close_seen;
+					} else {
+						state = state::text;
+						traits::append(result, 1, c); // output c here
+					}
+					break;
+				case state::open_seen:
+					if (c == char_type('{')) {
+						state = state::text;
+						traits::append(result, 1, char_type('{')); // output { here
+					} else if (c == char_type('}')) {
+						state = state::text;
+						unnumbered_args = true;
+						last_arg++;
+						this_arg = last_arg;
+						{ // output this_arg here
+							const std::size_t n = this_arg - 1;
+							if (n < std::size(vals)) {
+								traits::append(result, vals[n]);
+							}
+						}
+						if (this_arg > max_arg) {
+							max_arg = this_arg;
+						}
+						args += 1;
+					} else if (char_type('0') <= c && c <= char_type('9')) {
+						state = state::number_seen;
+						numbered_args = true;
+						current_arg = c - char_type('0');
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::number_seen:
+					if (c == char_type('{')) {
+						state = state::error;
+					} else if (c == char_type('}')) {
+						state = state::text;
+						this_arg = current_arg + 1;
+						{ // output this_arg here
+							const std::size_t n = this_arg - 1;
+							if (n < std::size(vals)) {
+								traits::append(result, vals[n]);
+							}
+						}
+						if (this_arg > max_arg) {
+							max_arg = this_arg;
+						}
+						args += 1;
+					} else if (char_type('0') <= c && c <= char_type('9')) {
+						state = state::number_seen;
+						numbered_args = true;
+						current_arg = (current_arg * 10) + (c - char_type('0'));
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::close_seen:
+					if (c == char_type('{')) {
+						state = state::error;
+					} else if (c == char_type('}')) {
+						state = state::text;
+						traits::append(result, 1, char_type('}')); // output } here
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::error:
+					state = state::error;
+					break;
+			}
+		}
+		if (state == state::error) {
+			success = false;
+		}
+		if (state != state::text) {
+			success = false;
+		}
+		if (numbered_args && unnumbered_args) {
+			success = false;
+		}
+		if (!success) {
+			throw format_message_syntax_error();
+		}
+		return result;
+	}
+
+public:
+	MPT_FORCEINLINE message_formatter(Tstring format_)
+		: format(std::move(format_)) {
+	}
+
+public:
+	template <typename... Ts>
+	MPT_NOINLINE Tstring operator()(Ts &&... xs) const {
+		const std::array<Tstring, sizeof...(xs)> vals{{Tformatter::template format<Tstring>(std::forward<Ts>(xs))...}};
+		return do_format(mpt::as_span(vals));
+	}
+
+}; // struct message_formatter<Tformat>
+
+
+template <typename Tformatter, std::ptrdiff_t N, typename Tchar, typename Tstring>
+class message_formatter_counted {
+
+private:
+	message_formatter<Tformatter, Tstring> formatter;
+
+public:
+	template <std::size_t literal_length>
+	inline message_formatter_counted(const Tchar (&format)[literal_length])
+		: formatter(Tstring(format)) {
+		return;
+	}
+
+public:
+	template <typename... Ts>
+	inline Tstring operator()(Ts &&... xs) const {
+		static_assert(static_cast<std::ptrdiff_t>(sizeof...(xs)) == N);
+		return formatter(std::forward<Ts>(xs)...);
+	}
+
+}; // struct message_formatter_counted<Tformat>
+
+
+template <typename Tchar>
+MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count_impl(const Tchar * const format, const std::size_t len) {
+	std::size_t max_arg = 0;
+	std::size_t args = 0;
+	bool success = true;
+	enum class state : int
+	{
+		error = -1,
+		text = 0,
+		open_seen = 1,
+		number_seen = 2,
+		close_seen = 3,
+	};
+	state state = state::text;
+	bool numbered_args = false;
+	bool unnumbered_args = false;
+	std::size_t last_arg = 0;
+	std::size_t this_arg = 0;
+	std::size_t current_arg = 0;
+	for (std::size_t pos = 0; pos != len; ++pos) {
+		Tchar c = format[pos];
+		switch (state) {
+			case state::text:
+				if (c == Tchar('{')) {
+					state = state::open_seen;
+				} else if (c == Tchar('}')) {
+					state = state::close_seen;
+				} else {
+					state = state::text;
+					// output c here
+				}
+				break;
+			case state::open_seen:
+				if (c == Tchar('{')) {
+					state = state::text;
+					// output { here
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					unnumbered_args = true;
+					last_arg++;
+					this_arg = last_arg;
+					// output this_arg here
+					if (this_arg > max_arg)
+					{
+						max_arg = this_arg;
+					}
+					args += 1;
+				} else if (Tchar('0') <= c && c <= Tchar('9')) {
+					state = state::number_seen;
+					numbered_args = true;
+					current_arg = c - Tchar('0');
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::number_seen:
+				if (c == Tchar('{')) {
+					state = state::error;
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					this_arg = current_arg + 1;
+					// output this_arg here
+					if (this_arg > max_arg) {
+						max_arg = this_arg;
+					}
+					args += 1;
+				} else if (Tchar('0') <= c && c <= Tchar('9')) {
+					state = state::number_seen;
+					numbered_args = true;
+					current_arg = (current_arg * 10) + (c - Tchar('0'));
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::close_seen:
+				if (c == Tchar('{')) {
+					state = state::error;
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					// output } here
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::error:
+				state = state::error;
+				break;
+		}
+	}
+	if (state == state::error) {
+		success = false;
+	}
+	if (state != state::text) {
+		success = false;
+	}
+	if (numbered_args && unnumbered_args) {
+		success = false;
+	}
+	if (!success) {
+		throw format_message_syntax_error();
+	}
+	if (max_arg != args) {
+		throw format_message_syntax_error();
+	}
+	return max_arg;
+}
+
+
+template <typename Tchar, std::size_t literal_length>
+MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count(const Tchar (&format)[literal_length]) {
+	return parse_format_string_argument_count_impl(format, literal_length - 1);
+}
+
+
+template <typename Tformatter, std::size_t args, typename Tchar, std::size_t N>
+inline auto format_message(const Tchar (&format)[N]) {
+	using Tstring = typename mpt::make_string_type<const Tchar *>::type;
+	return message_formatter_counted<Tformatter, args, Tchar, Tstring>(format);
+}
+
+template <typename Tformatter, std::size_t args, typename Tstring, typename Tchar, std::size_t N>
+inline auto format_message_typed(const Tchar (&format)[N]) {
+	return message_formatter_counted<Tformatter, args, Tchar, Tstring>(format);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_MESSAGE_HPP

Property changes on: src/mpt/string/format_message.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_message_macros.hpp
===================================================================
--- src/mpt/string/format_message_macros.hpp	(nonexistent)
+++ src/mpt/string/format_message_macros.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_MESSAGE_MACROS_HPP
+#define MPT_STRING_FORMAT_MESSAGE_MACROS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/format_default_formatter.hpp"
+#include "mpt/string/format_message.hpp"
+
+
+
+#define MPT_FORMAT_MESSAGE(f) mpt::format_message<mpt::default_formatter, mpt::parse_format_string_argument_count(f)>(f)
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#define MPT_WFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(L##f), std::wstring>(L##f)
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#define MPT_UFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(MPT_ULITERAL(f)), mpt::ustring>(MPT_ULITERAL(f))
+
+#define MPT_LFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(f), mpt::lstring>(f)
+
+#if MPT_OS_WINDOWS
+#define MPT_TFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(TEXT(f)), mpt::tstring>(TEXT(f))
+#endif
+
+#if MPT_DETECTED_MFC
+#define MPT_CWFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(L##f), CStringW>(L##f)
+#define MPT_CAFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(f), CStringA>(f)
+#define MPT_CFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(TEXT(f)), CString>(TEXT(f))
+#endif // MPT_DETECTED_MFC
+
+
+
+#endif // MPT_STRING_FORMAT_MESSAGE_MACROS_HPP

Property changes on: src/mpt/string/format_message_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple.hpp
===================================================================
--- src/mpt/string/format_simple.hpp	(nonexistent)
+++ src/mpt/string/format_simple.hpp	(working copy)
@@ -0,0 +1,166 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_HPP
+#define MPT_STRING_FORMAT_SIMPLE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/pointer.hpp"
+#include "mpt/string/format_default_formatter.hpp"
+#include "mpt/string/format_simple_floatingpoint.hpp"
+#include "mpt/string/format_simple_integer.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename Tstring>
+struct format : format_simple_base {
+
+	template <typename T>
+	static inline Tstring val(const T & x) {
+		return mpt::default_formatter::format<Tstring>(x);
+	}
+
+	template <typename T>
+	static inline Tstring fmt(const T & x, const format_simple_spec & f) {
+		return mpt::format_simple<Tstring>(x, f);
+	}
+
+	template <typename T>
+	static inline Tstring dec(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillOff());
+	}
+	template <int width, typename T>
+	static inline Tstring dec0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillNul().Width(width));
+	}
+
+	template <typename T>
+	static inline Tstring dec(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillOff().Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring dec0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+
+	template <typename T>
+	static inline Tstring hex(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillOff());
+	}
+	template <typename T>
+	static inline Tstring HEX(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillOff());
+	}
+	template <int width, typename T>
+	static inline Tstring hex0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillNul().Width(width));
+	}
+	template <int width, typename T>
+	static inline Tstring HEX0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillNul().Width(width));
+	}
+
+	template <typename T>
+	static inline Tstring hex(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillOff().Group(g).GroupSep(s));
+	}
+	template <typename T>
+	static inline Tstring HEX(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillOff().Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring hex0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring HEX0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+
+	template <typename T>
+	static inline Tstring flt(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaNrm().FillOff().Precision(precision));
+	}
+	template <typename T>
+	static inline Tstring fix(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaFix().FillOff().Precision(precision));
+	}
+	template <typename T>
+	static inline Tstring sci(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaSci().FillOff().Precision(precision));
+	}
+
+	template <typename T>
+	static inline Tstring ptr(const T & x) {
+		static_assert(std::is_pointer<T>::value || std::is_same<T, std::uintptr_t>::value || std::is_same<T, std::intptr_t>::value, "");
+		return hex0<mpt::pointer_size * 2>(mpt::pointer_cast<const std::uintptr_t>(x));
+	}
+	template <typename T>
+	static inline Tstring PTR(const T & x) {
+		static_assert(std::is_pointer<T>::value || std::is_same<T, std::uintptr_t>::value || std::is_same<T, std::intptr_t>::value, "");
+		return HEX0<mpt::pointer_size * 2>(mpt::pointer_cast<const std::uintptr_t>(x));
+	}
+
+	static inline Tstring pad_left(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return traits::pad(str, width, 0);
+	}
+	static inline Tstring pad_right(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return traits::pad(str, 0, width);
+	}
+	static inline Tstring left(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, 0, width - traits::length(str)) : str;
+	}
+	static inline Tstring right(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, width - traits::length(str), 0) : str;
+	}
+	static inline Tstring center(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, (width - traits::length(str)) / 2, (width - traits::length(str) + 1) / 2) : str;
+	}
+
+}; // struct format
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_HPP

Property changes on: src/mpt/string/format_simple.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_floatingpoint.hpp
===================================================================
--- src/mpt/string/format_simple_floatingpoint.hpp	(nonexistent)
+++ src/mpt/string/format_simple_floatingpoint.hpp	(working copy)
@@ -0,0 +1,242 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP
+#define MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/string/format_default_floatingpoint.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include "mpt/base/algorithm.hpp"
+#endif
+#include "mpt/string/convert.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include <charconv>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <iomanip>
+#include <ios>
+#endif
+#if MPT_FORMAT_CXX17_FLOAT
+#include <iterator>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <limits>
+#include <locale>
+#include <sstream>
+#endif
+#include <string>
+#if MPT_FORMAT_CXX17_FLOAT
+#include <system_error>
+#endif
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_FORMAT_CXX17_FLOAT
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_to_chars(const T & x, std::chars_format fmt) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, fmt);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_to_chars(const T & x, std::chars_format fmt, int precision) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, fmt, precision);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring>
+inline Tstring format_simple_floatingpoint_postprocess_width(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	if (f & format_simple_base::FillNul) {
+		auto pos = str.begin();
+		if (str.length() > 0) {
+			if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+')) {
+				pos++;
+				width++;
+			} else if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')) {
+				pos++;
+				width++;
+			}
+		}
+		if (str.length() - std::distance(str.begin(), pos) < width) {
+			str.insert(pos, width - str.length() - std::distance(str.begin(), pos), '0');
+		}
+	} else {
+		if (str.length() < width) {
+			str.insert(0, width - str.length(), ' ');
+		}
+	}
+	return str;
+}
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & f) {
+	using format_string_type = typename mpt::select_format_string_type<Tstring>::type;
+	if (f.GetPrecision() != -1) {
+		if (f.GetFlags() & format_simple_base::NotaSci) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::scientific, f.GetPrecision()), f));
+		} else if (f.GetFlags() & format_simple_base::NotaFix) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::fixed, f.GetPrecision()), f));
+		} else {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::general, f.GetPrecision()), f));
+		}
+	} else {
+		if (f.GetFlags() & format_simple_base::NotaSci) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::scientific), f));
+		} else if (f.GetFlags() & format_simple_base::NotaFix) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::fixed), f));
+		} else {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::general), f));
+		}
+	}
+}
+
+
+#else // !MPT_FORMAT_CXX17_FLOAT
+
+
+template <typename Tchar>
+struct NumPunct : std::numpunct<Tchar> {
+private:
+	unsigned int group;
+	char sep;
+
+public:
+	NumPunct(unsigned int g, char s)
+		: group(g)
+		, sep(s) { }
+	std::string do_grouping() const override {
+		return std::string(1, static_cast<char>(group));
+	}
+	Tchar do_thousands_sep() const override {
+		return static_cast<Tchar>(sep);
+	}
+};
+
+template <typename Tostream, typename T>
+inline void format_simple_floatingpoint_apply_stream_format(Tostream & o, const format_simple_spec & format, const T &) {
+	if (format.GetGroup() > 0)
+	{
+		o.imbue(std::locale(o.getloc(), new NumPunct<typename Tostream::char_type>(format.GetGroup(), format.GetGroupSep())));
+	}
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	int precision = format.GetPrecision();
+	if (precision != -1 && width != 0 && !(f & format_simple_base::NotaFix) && !(f & format_simple_base::NotaSci))
+	{
+		// fixup:
+		// precision behaves differently from .#
+		// avoid default format when precision and width are set
+		f &= ~format_simple_base::NotaNrm;
+		f |= format_simple_base::NotaFix;
+	}
+	if (f & format_simple_base::BaseDec) {
+		o << std::dec;
+	} else if (f & format_simple_base::BaseHex) {
+		o << std::hex;
+	}
+	if (f & format_simple_base::NotaNrm) { /*nothing*/
+	} else if (f & format_simple_base::NotaFix) {
+		o << std::setiosflags(std::ios::fixed);
+	} else if (f & format_simple_base::NotaSci) {
+		o << std::setiosflags(std::ios::scientific);
+	}
+	if (f & format_simple_base::CaseLow) {
+		o << std::nouppercase;
+	} else if (f & format_simple_base::CaseUpp) {
+		o << std::uppercase;
+	}
+	if (f & format_simple_base::FillOff) { /* nothing */
+	} else if (f & format_simple_base::FillNul) {
+		o << std::setw(width) << std::setfill(typename Tostream::char_type('0'));
+	}
+	if (precision != -1)
+	{
+		o << std::setprecision(precision);
+	} else
+	{
+		if constexpr (std::is_floating_point<T>::value)
+		{
+			if (f & format_simple_base::NotaNrm)
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10);
+			} else if (f & format_simple_base::NotaFix)
+			{
+				o << std::setprecision(std::numeric_limits<T>::digits10);
+			} else if (f & format_simple_base::NotaSci)
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10 - 1);
+			} else
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10);
+			}
+		}
+	}
+}
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_stream(const T & x, const format_simple_spec & f) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	mpt::format_simple_floatingpoint_apply_stream_format(s, f, x);
+	s << x;
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & format) {
+	return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_stream<typename mpt::select_format_string_type<Tstring>::type>(x, format));
+}
+
+
+
+#endif // MPT_FORMAT_CXX17_FLOAT
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP

Property changes on: src/mpt/string/format_simple_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_integer.hpp
===================================================================
--- src/mpt/string/format_simple_integer.hpp	(nonexistent)
+++ src/mpt/string/format_simple_integer.hpp	(working copy)
@@ -0,0 +1,134 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP
+#define MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP
+
+
+#include "mpt/base/algorithm.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+
+#include <charconv>
+#include <string>
+#include <system_error>
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_simple_integer_to_chars(const T & x, int base) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		if constexpr (std::is_same<T, bool>::value) {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), static_cast<int>(x), base);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		} else {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, base);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_case(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	if (f & format_simple_base::CaseUpp) {
+		for (auto & c : str) {
+			if (mpt::unsafe_char_convert<typename Tstring::value_type>('a') <= c && c <= mpt::unsafe_char_convert<typename Tstring::value_type>('z')) {
+				c -= mpt::unsafe_char_convert<typename Tstring::value_type>('a') - mpt::unsafe_char_convert<typename Tstring::value_type>('A');
+			}
+		}
+	}
+	return str;
+}
+
+
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_digits(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	if (f & format_simple_base::FillNul) {
+		auto pos = str.begin();
+		if (str.length() > 0) {
+			if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+')) {
+				pos++;
+				width++;
+			} else if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')) {
+				pos++;
+				width++;
+			}
+		}
+		if (str.length() < width) {
+			str.insert(pos, width - str.length(), mpt::unsafe_char_convert<typename Tstring::value_type>('0'));
+		}
+	}
+	return str;
+}
+
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4723) // potential divide by 0
+#endif                          // MPT_COMPILER_MSVC
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_group(Tstring str, const format_simple_spec & format) {
+	if (format.GetGroup() > 0) {
+		const unsigned int groupSize = format.GetGroup();
+		const char groupSep = format.GetGroupSep();
+		std::size_t len = str.length();
+		for (std::size_t n = 0; n < len; ++n) {
+			if (n > 0 && (n % groupSize) == 0) {
+				if (!(n == (len - 1) && (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+') || str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')))) {
+					str.insert(str.begin() + (len - n), 1, mpt::unsafe_char_convert<typename Tstring::value_type>(groupSep));
+				}
+			}
+		}
+	}
+	return str;
+}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & format) {
+	int base = 10;
+	if (format.GetFlags() & format_simple_base::BaseDec) {
+		base = 10;
+	}
+	if (format.GetFlags() & format_simple_base::BaseHex) {
+		base = 16;
+	}
+	using format_string_type = typename mpt::select_format_string_type<Tstring>::type;
+	return mpt::convert<Tstring>(mpt::format_simple_integer_postprocess_group(mpt::format_simple_integer_postprocess_digits(mpt::format_simple_integer_postprocess_case(mpt::format_simple_integer_to_chars<format_string_type>(x, base), format), format), format));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP

Property changes on: src/mpt/string/format_simple_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_spec.hpp
===================================================================
--- src/mpt/string/format_simple_spec.hpp	(nonexistent)
+++ src/mpt/string/format_simple_spec.hpp	(working copy)
@@ -0,0 +1,218 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_SPEC_HPP
+#define MPT_STRING_FORMAT_SIMPLE_SPEC_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+struct format_simple_base {
+
+	enum FormatFlagsEnum
+	{
+		BaseDec = 0x0001, // base 10 (integers only)        // int+float
+		BaseHex = 0x0002, // base 16 (integers only)        // int+float
+		CaseLow = 0x0010, // lower case hex digits          // int+float
+		CaseUpp = 0x0020, // upper case hex digits          // int+float
+		FillOff = 0x0100, // do not fill up width           // int+float
+		FillNul = 0x0400, // fill up width with zeros       // int+float
+		NotaNrm = 0x1000, // float: normal/default notation // float
+		NotaFix = 0x2000, // float: fixed point notation    // float
+		NotaSci = 0x4000, // float: scientific notation     // float
+	};
+
+}; // struct format_simple_base
+
+using format_simple_flags = unsigned int;
+
+static_assert(sizeof(format_simple_flags) >= sizeof(format_simple_base::FormatFlagsEnum));
+
+
+class format_simple_spec {
+private:
+	format_simple_flags flags;
+	std::size_t width;  // int+float
+	int precision;      // float
+	unsigned int group; // int
+	char group_sep;     // int
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec() noexcept
+		: flags(0), width(0), precision(-1), group(0), group_sep(',') { }
+	MPT_CONSTEXPRINLINE format_simple_flags GetFlags() const noexcept {
+		return flags;
+	}
+	MPT_CONSTEXPRINLINE std::size_t GetWidth() const noexcept {
+		return width;
+	}
+	MPT_CONSTEXPRINLINE int GetPrecision() const noexcept {
+		return precision;
+	}
+	MPT_CONSTEXPRINLINE unsigned int GetGroup() const noexcept {
+		return group;
+	}
+	MPT_CONSTEXPRINLINE char GetGroupSep() const noexcept {
+		return group_sep;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetFlags(format_simple_flags f) noexcept {
+		flags = f;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetWidth(std::size_t w) noexcept {
+		width = w;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetPrecision(int p) noexcept {
+		precision = p;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetGroup(unsigned int g) noexcept {
+		group = g;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetGroupSep(char s) noexcept {
+		group_sep = s;
+		return *this;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & BaseDec() noexcept {
+		flags &= ~(format_simple_base::BaseDec | format_simple_base::BaseHex);
+		flags |= format_simple_base::BaseDec;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & BaseHex() noexcept {
+		flags &= ~(format_simple_base::BaseDec | format_simple_base::BaseHex);
+		flags |= format_simple_base::BaseHex;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & CaseLow() noexcept {
+		flags &= ~(format_simple_base::CaseLow | format_simple_base::CaseUpp);
+		flags |= format_simple_base::CaseLow;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & CaseUpp() noexcept {
+		flags &= ~(format_simple_base::CaseLow | format_simple_base::CaseUpp);
+		flags |= format_simple_base::CaseUpp;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillOff() noexcept {
+		flags &= ~(format_simple_base::FillOff | format_simple_base::FillNul);
+		flags |= format_simple_base::FillOff;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillNul() noexcept {
+		flags &= ~(format_simple_base::FillOff | format_simple_base::FillNul);
+		flags |= format_simple_base::FillNul;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaNrm() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaNrm;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaFix() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaFix;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaSci() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaSci;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Width(std::size_t w) noexcept {
+		width = w;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Prec(int p) noexcept {
+		precision = p;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Group(unsigned int g) noexcept {
+		group = g;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & GroupSep(char s) noexcept {
+		group_sep = s;
+		return *this;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & Dec() noexcept {
+		return BaseDec();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Hex() noexcept {
+		return BaseHex();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Low() noexcept {
+		return CaseLow();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Upp() noexcept {
+		return CaseUpp();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Off() noexcept {
+		return FillOff();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Nul() noexcept {
+		return FillNul();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Nrm() noexcept {
+		return NotaNrm();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Fix() noexcept {
+		return NotaFix();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Sci() noexcept {
+		return NotaSci();
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & Decimal() noexcept {
+		return BaseDec();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Hexadecimal() noexcept {
+		return BaseHex();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Lower() noexcept {
+		return CaseLow();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Upper() noexcept {
+		return CaseUpp();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillNone() noexcept {
+		return FillOff();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillZero() noexcept {
+		return FillNul();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatNormal() noexcept {
+		return NotaNrm();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatFixed() noexcept {
+		return NotaFix();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatScientific() noexcept {
+		return NotaSci();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Precision(int p) noexcept {
+		return Prec(p);
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_SPEC_HPP

Property changes on: src/mpt/string/format_simple_spec.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/parse.hpp
===================================================================
--- src/mpt/string/parse.hpp	(nonexistent)
+++ src/mpt/string/parse.hpp	(working copy)
@@ -0,0 +1,107 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_PARSE_HPP
+#define MPT_STRING_PARSE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <ios>
+#include <locale>
+#include <sstream>
+#include <string>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline std::string parse_as_internal_string_type(const std::string & s) {
+	return s;
+}
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+inline std::wstring parse_as_internal_string_type(const std::wstring & s) {
+	return s;
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_USTRING_MODE_WIDE
+template <typename Tstring>
+inline std::wstring parse_as_internal_string_type(const Tstring & s) {
+	return mpt::convert<std::wstring>(s);
+}
+#else  // !MPT_USTRING_MODE_WIDE
+template <typename Tstring>
+inline std::string parse_as_internal_string_type(const Tstring & s) {
+	return mpt::convert<std::string>(mpt::common_encoding::utf8, s);
+}
+#endif // MPT_USTRING_MODE_WIDE
+
+
+template <typename T, typename Tstring>
+inline T ConvertStringTo(const Tstring & str) {
+	std::basic_istringstream<typename decltype(mpt::parse_as_internal_string_type(mpt::as_string(str)))::value_type> stream(mpt::parse_as_internal_string_type(mpt::as_string(str)));
+	stream.imbue(std::locale::classic());
+	T value;
+	if constexpr (std::is_same<T, signed char>::value) {
+		signed int tmp;
+		if (!(stream >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else if constexpr (std::is_same<T, unsigned char>::value) {
+		unsigned int tmp;
+		if (!(stream >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else {
+		if (!(stream >> value)) {
+			return T{};
+		}
+	}
+	return value;
+}
+
+
+template <typename T, typename Tstring>
+inline T ConvertHexStringTo(const Tstring & str) {
+	std::basic_istringstream<typename decltype(mpt::parse_as_internal_string_type(mpt::as_string(str)))::value_type> stream(mpt::parse_as_internal_string_type(mpt::as_string(str)));
+	stream.imbue(std::locale::classic());
+	T value;
+	if constexpr (std::is_same<T, signed char>::value) {
+		signed int tmp;
+		if (!(stream >> std::hex >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else if constexpr (std::is_same<T, unsigned char>::value) {
+		unsigned int tmp;
+		if (!(stream >> std::hex >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else {
+		if (!(stream >> std::hex >> value)) {
+			return T{};
+		}
+	}
+	return value;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_PARSE_HPP

Property changes on: src/mpt/string/parse.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_buffer.hpp
===================================================================
--- src/mpt/string/tests/tests_string_buffer.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_buffer.hpp	(working copy)
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_BUFFER_HPP
+#define MPT_STRING_TESTS_STRING_BUFFER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/buffer.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_buffer{
+	"mpt/string/buffer",
+	[](mpt::test::context & context) {
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteAutoBuf(buf) = std::string("foobar");
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			char foobar[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'};
+			mpt::WriteTypedBuf<std::string>(buf) = (char *)foobar;
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteTypedBuf<std::string>(buf) = (const char *)"foobar";
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteTypedBuf<std::string>(buf) = "foobar";
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			const char buf[4] = {'f', 'o', 'o', 'b'};
+			std::string foo = mpt::ReadAutoBuf(buf);
+			MPT_TEST_EXPECT_EQUAL(foo, std::string("foob"));
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_BUFFER_HPP

Property changes on: src/mpt/string/tests/tests_string_buffer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_convert.hpp
===================================================================
--- src/mpt/string/tests/tests_string_convert.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_convert.hpp	(working copy)
@@ -0,0 +1,222 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_CONVERT_HPP
+#define MPT_STRING_TESTS_STRING_CONVERT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/convert_macros.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_convert{
+	"mpt/string/convert",
+	[](mpt::test::context & context) {
+		// MPT_UTF8_STRING version
+
+		// Charset conversions (basic sanity checks)
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "a"), MPT_USTRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "a"), MPT_USTRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "a"), MPT_USTRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "a"), MPT_USTRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "a"), MPT_UTF8_STRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "a"), MPT_UTF8_STRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "a"), MPT_UTF8_STRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "a"), MPT_UTF8_STRING("a"));
+
+#if MPT_OS_EMSCRIPTEN
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("\xe2\x8c\x82")), "\xe2\x8c\x82");
+#endif // MPT_OS_EMSCRIPTEN
+
+		// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
+		// We test german umlaut-a (U+00E4) (\xC3\xA4) and CJK U+5BB6 (\xE5\xAE\xB6)
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+
+		// Check that characters are correctly converted
+		// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+		// cp437
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\x84xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\x84xyz"));
+
+		// iso8859
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\xE4xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE4xyz"));
+
+		// utf8
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\xC3\xA4xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc\xE5\xAE\xB6xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"));
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+
+		// wide L"" version
+
+		// Charset conversions (basic sanity checks)
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "a"), L"a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "a"), L"a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "a"), L"a");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "a"), L"a");
+
+	// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
+	// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4428) // universal-character-name encountered in source
+#endif
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u00E4xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u5BB6xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), L"abc"));
+
+		// Check that characters are correctly converted
+		// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+		// cp437
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "abc\x84xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\x84xyz"));
+
+		// iso8859
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "abc\xE4xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE4xyz"));
+
+		// utf8
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "abc\xC3\xA4xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "abc\xE5\xAE\xB6xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u5BB6xyz", mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"));
+
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif
+
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_CONVERT_HPP

Property changes on: src/mpt/string/tests/tests_string_convert.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_format_message.hpp
===================================================================
--- src/mpt/string/tests/tests_string_format_message.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_format_message.hpp	(working copy)
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP
+#define MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_message.hpp"
+#include "mpt/string/format_message_macros.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_format_message{
+	"mpt/string/format_message",
+	[](mpt::test::context & context) {
+		static_assert(mpt::parse_format_string_argument_count("") == 0);
+		static_assert(mpt::parse_format_string_argument_count("{{") == 0);
+		static_assert(mpt::parse_format_string_argument_count("}}") == 0);
+		static_assert(mpt::parse_format_string_argument_count("{}") == 1);
+		static_assert(mpt::parse_format_string_argument_count("{}{}") == 2);
+		static_assert(mpt::parse_format_string_argument_count("{0}{1}") == 2);
+
+		// basic
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}{}{}")(1, 2, 3), "123");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{2}{1}{0}")(1, 2, 3), "321");
+
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{2}{1}{0}{4}{3}{6}{5}{7}{10}{9}{8}")(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a"), "21043657a98");
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE(L"{}{}{}")(1, 2, 3), L"123");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+		// escaping behviour
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%")(), "%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%")(), "%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%%")(), "%%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}")("a"), "a");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%")("a"), "a%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%")("a"), "a%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%%")("a"), "a%%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%1")(), "%1");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%{}")("a"), "%a");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%b")(), "%b");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{{}}")(), "{}");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{{{}}}")("a"), "{a}");
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP

Property changes on: src/mpt/string/tests/tests_string_format_message.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_format_simple.hpp
===================================================================
--- src/mpt/string/tests/tests_string_format_simple.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_format_simple.hpp	(working copy)
@@ -0,0 +1,154 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP
+#define MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_format_simple{
+	"mpt/string/format_simple",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(1.5f), "1.5");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(true), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(false), "0");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(0), "0");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(-23), "-23");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(42), "42");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<3>((int32)-1), "-001");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex((int32)-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(-0xabcde), "-abcde");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(std::numeric_limits<int32>::min()), "-80000000");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(std::numeric_limits<int32>::min() + 1), "-7fffffff");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(0x123e), "123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<6>(0x123e), "00123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<2>(0x123e), "123e");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(1), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(1), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(1), "01");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(1), "001");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(11), "011");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(-1), "-01");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(-1), "-001");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(0xa2345678), MPT_USTRING("A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(0xa2345678), MPT_USTRING("A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(0xa2345678), MPT_USTRING("0A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(0xa2345678), MPT_USTRING("00A2345678"));
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex(0x123e), L"123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex0<6>(0x123e), L"00123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex0<2>(0x123e), L"123e");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(-87.0f), "-87");
+		if (mpt::format<std::string>::val(-0.5e-6) != "-5e-007"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-5e-07"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-5e-7"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-7"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-07"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-007")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-005"
+			&& mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-05"
+			&& mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-5")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-005"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-05"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-5"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-005"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-05"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-5")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(58.65403492763) != "58.654034927630001"
+			&& mpt::format<std::string>::val(58.65403492763) != "58.65403492763")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(58.65403492763, 6), "58.654");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(23.42, 1), "23.4");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(234.2, 1), "234.2");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(2342.0, 1), "2342.0");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec(2, ';', 2345678), std::string("2;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec(2, ';', 12345678), std::string("12;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(3, ':', 0xa2345678), std::string("a2:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::dec(2, ';', 12345678), MPT_USTRING("12;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::hex(3, ':', 0xa2345678), MPT_USTRING("a2:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', 0xa2345678), MPT_USTRING("A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(3, ':', 0xa2345678), MPT_USTRING("A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(3, ':', 0xa2345678), MPT_USTRING("0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(3, ':', 0xa2345678), MPT_USTRING("0:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<11>(3, ':', 0xa2345678), MPT_USTRING("00:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<12>(3, ':', 0xa2345678), MPT_USTRING("000:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', -0x12345678), MPT_USTRING("-12:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(3, ':', -0x12345678), MPT_USTRING("-12:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(3, ':', -0x12345678), MPT_USTRING("-012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(3, ':', -0x12345678), MPT_USTRING("-0:012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<11>(3, ':', -0x12345678), MPT_USTRING("-00:012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<12>(3, ':', -0x12345678), MPT_USTRING("-000:012:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<5>(3, ':', 0x345678), MPT_USTRING("345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<6>(3, ':', 0x345678), MPT_USTRING("345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', 0x345678), MPT_USTRING("0:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<5>(3, ':', -0x345678), MPT_USTRING("-345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<6>(3, ':', -0x345678), MPT_USTRING("-345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', -0x345678), MPT_USTRING("-0:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::left(3, "a"), "a  ");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::right(3, "a"), "  a");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::center(3, "a"), " a ");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::center(4, "a"), " a  ");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(6.12345, 3), "6.12");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(6.12345, 3), "6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(6.12345, 4), "6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(6.12345, 4), "6.1235");
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::flt(6.12345, 3), L"6.12");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::fix(6.12345, 3), L"6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::flt(6.12345, 4), L"6.123");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP

Property changes on: src/mpt/string/tests/tests_string_format_simple.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_parse.hpp
===================================================================
--- src/mpt/string/tests/tests_string_parse.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_parse.hpp	(working copy)
@@ -0,0 +1,70 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_PARSE_HPP
+#define MPT_STRING_TESTS_STRING_PARSE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/parse.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_parse{
+	"mpt/string/parse",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("586"), 586u);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("2147483647"), (uint32)std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("4294967295"), std::numeric_limits<uint32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("-9223372036854775808"), std::numeric_limits<int64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("-159"), -159);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("9223372036854775807"), std::numeric_limits<int64>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("85059"), 85059u);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("9223372036854775807"), (uint64)std::numeric_limits<int64>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("18446744073709551615"), std::numeric_limits<uint64>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<float>("-87.0"), -87.0f);
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>("-0.5e-6"), -0.5e-6);
+#endif
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>("58.65403492763"), 58.65403492763);
+#else
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStrTo<double>("58.65403492763"), 58.65403492763, 0.0001);
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<float>(mpt::format<std::string>::val(-87.0)), -87.0f);
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>(mpt::format<std::string>::val(-0.5e-6)), -0.5e-6);
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned char>("fe"), 254);
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned char>(L"fe"), 254);
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned int>(MPT_USTRING("ffff")), 65535u);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_PARSE_HPP

Property changes on: src/mpt/string/tests/tests_string_parse.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_utility.hpp
===================================================================
--- src/mpt/string/tests/tests_string_utility.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_utility.hpp	(working copy)
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_UTILITY_HPP
+#define MPT_STRING_TESTS_STRING_UTILITY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/utility.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_utility{
+	"mpt/string/utility",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_left(std::string(" ")), "");
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_right(std::string(" ")), "");
+		MPT_TEST_EXPECT_EQUAL(mpt::trim(std::string(" ")), "");
+
+		// weird things with std::string containing \0 in the middle and trimming \0
+		MPT_TEST_EXPECT_EQUAL(std::string("\0\ta\0b ", 6).length(), (std::size_t)6);
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_right(std::string("\0\ta\0b ", 6)), std::string("\0\ta\0b", 5));
+		MPT_TEST_EXPECT_EQUAL(mpt::trim(std::string("\0\ta\0b\0", 6), std::string("\0", 1)), std::string("\ta\0b", 4));
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_UTILITY_HPP

Property changes on: src/mpt/string/tests/tests_string_utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/types.hpp
===================================================================
--- src/mpt/string/types.hpp	(nonexistent)
+++ src/mpt/string/types.hpp	(working copy)
@@ -0,0 +1,406 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TYPES_HPP
+#define MPT_STRING_TYPES_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <string>
+#include <type_traits>
+
+#include <cstddef>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+enum class common_encoding
+{
+	utf8,
+	ascii, // strictly 7-bit ASCII
+	iso8859_1,
+	iso8859_15,
+	cp850,
+	cp437,
+	windows1252,
+};
+
+
+enum class logical_encoding
+{
+	locale,        // CP_ACP on windows, system configured C locale otherwise
+	active_locale, // active C/C++ global locale
+};
+
+// source code / preprocessor (i.e. # token)
+inline constexpr auto source_encoding = common_encoding::ascii;
+
+// debug log files
+inline constexpr auto logfile_encoding = common_encoding::utf8;
+
+// std::clog / std::cout / std::cerr
+inline constexpr auto stdio_encoding = logical_encoding::locale;
+
+// getenv
+inline constexpr auto environment_encoding = logical_encoding::locale;
+
+// std::exception::what()
+inline constexpr auto exception_encoding = logical_encoding::active_locale;
+
+
+
+
+
+template <typename T>
+struct is_character : public std::false_type { };
+
+template <>
+struct is_character<char> : public std::true_type { };
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct is_character<wchar_t> : public std::true_type { };
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct is_character<char8_t> : public std::true_type { };
+#endif // C++20
+template <>
+struct is_character<char16_t> : public std::true_type { };
+template <>
+struct is_character<char32_t> : public std::true_type { };
+
+
+
+
+
+template <typename T>
+MPT_CONSTEXPRINLINE unsigned char char_value(T x) noexcept = delete;
+
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<char>(char x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<unsigned char>(unsigned char x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<char8_t>(char8_t x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+#endif // C++20
+
+
+
+
+
+template <typename T>
+struct unsafe_char_converter { };
+
+template <>
+struct unsafe_char_converter<char> {
+	static constexpr char32_t decode(char c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char encode(char32_t c) noexcept {
+		return static_cast<char>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct unsafe_char_converter<wchar_t> {
+	static constexpr char32_t decode(wchar_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr wchar_t encode(char32_t c) noexcept {
+		return static_cast<wchar_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct unsafe_char_converter<char8_t> {
+	static constexpr char32_t decode(char8_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char8_t encode(char32_t c) noexcept {
+		return static_cast<char8_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+#endif // C++20
+
+template <>
+struct unsafe_char_converter<char16_t> {
+	static constexpr char32_t decode(char16_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char16_t encode(char32_t c) noexcept {
+		return static_cast<char16_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+template <>
+struct unsafe_char_converter<char32_t> {
+	static constexpr char32_t decode(char32_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char32_t encode(char32_t c) noexcept {
+		return static_cast<char32_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+template <typename Tdstchar, typename Tsrcchar>
+constexpr Tdstchar unsafe_char_convert(Tsrcchar src) noexcept {
+	return mpt::unsafe_char_converter<Tdstchar>::encode(mpt::unsafe_char_converter<Tsrcchar>::decode(src));
+}
+
+
+
+
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+using widestring = std::wstring;
+using widechar = wchar_t;
+#define MPT_WIDECHAR(x)    L##x
+#define MPT_WIDELITERAL(x) L##x
+#define MPT_WIDESTRING(x)  std::wstring(L##x)
+#else // MPT_COMPILER_QUIRK_NO_WCHAR
+using widestring = std::u32string;
+using widechar = char32_t;
+#define MPT_WIDECHAR(x)    U##x
+#define MPT_WIDELITERAL(x) U##x
+#define MPT_WIDESTRING(x)  std::u32string(U##x)
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+
+template <common_encoding common_encoding_tag>
+struct common_encoding_char_traits : std::char_traits<char> {
+	static constexpr auto encoding() noexcept {
+		return common_encoding_tag;
+	}
+};
+
+template <logical_encoding logical_encoding_tag>
+struct logical_encoding_char_traits : std::char_traits<char> {
+	static constexpr auto encoding() noexcept {
+		return logical_encoding_tag;
+	}
+};
+
+
+
+using lstring = std::basic_string<char, mpt::logical_encoding_char_traits<logical_encoding::locale>>;
+
+using source_string = std::basic_string<char, mpt::common_encoding_char_traits<source_encoding>>;
+using exception_string = std::basic_string<char, mpt::logical_encoding_char_traits<exception_encoding>>;
+
+#if MPT_OS_WINDOWS
+
+template <typename Tchar>
+struct windows_char_traits { };
+template <>
+struct windows_char_traits<CHAR> { using string_type = mpt::lstring; };
+template <>
+struct windows_char_traits<WCHAR> { using string_type = std::wstring; };
+
+using tstring = windows_char_traits<TCHAR>::string_type;
+
+using winstring = mpt::tstring;
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using u8string = std::u8string;
+using u8char = char8_t;
+#define MPT_U8CHAR(x)    u8##x
+#define MPT_U8LITERAL(x) u8##x
+#define MPT_U8STRING(x)  std::u8string(u8##x)
+
+#else // !C++20
+
+using u8string = std::basic_string<char, mpt::common_encoding_char_traits<common_encoding::utf8>>;
+using u8char = char;
+#define MPT_U8CHAR(x)    x
+#define MPT_U8LITERAL(x) x
+#define MPT_U8STRING(x)  mpt::u8string(x)
+
+// mpt::u8string is a moderately type-safe string that is meant to contain
+// UTF-8 encoded char bytes.
+//
+// mpt::u8string is not implicitely convertible to/from std::string, but
+// it is convertible to/from C strings the same way as std::string is.
+//
+// The implementation of mpt::u8string is a compromise of compatibilty
+// with implementation-defined STL details, efficiency, source code size,
+// executable bloat, type-safety  and simplicity.
+//
+// mpt::u8string is not meant to be used directly though.
+// mpt::u8string is meant as an alternative implementaion to std::wstring
+// for implementing the unicode string type mpt::ustring.
+
+#endif // C++20
+
+
+
+#if !defined(MPT_USTRING_MODE_UTF8_FORCE) && (MPT_COMPILER_MSVC || (MPT_DETECTED_MFC && defined(UNICODE)))
+// Use wide strings for MSVC because this is the native encoding on
+// microsoft platforms.
+#define MPT_USTRING_MODE_WIDE 1
+#define MPT_USTRING_MODE_UTF8 0
+#else
+#define MPT_USTRING_MODE_WIDE 0
+#define MPT_USTRING_MODE_UTF8 1
+#endif
+
+// mpt::ustring
+//
+// mpt::ustring is a string type that can hold unicode strings.
+// It is implemented as a std::basic_string either based on wchar_t (i.e. the
+//  same as std::wstring) or a custom-defined char_traits class that is derived
+//  from std::char_traits<char>.
+// The selection of the underlying implementation is done at compile-time.
+// MPT_UCHAR, MPT_ULITERAL and MPT_USTRING are macros that ease construction
+//  of ustring char literals, ustring char array literals and ustring objects
+//  from ustring char literals that work consistently in both modes.
+//  Note that these are not supported for non-ASCII characters appearing in
+//  the macro argument.
+// Also note that, as both UTF8 and UTF16 (it is less of an issue for UTF32)
+//  are variable-length encodings and mpt::ustring is implemented as a
+//  std::basic_string, all member functions that require individual character
+//  access will not work consistently or even at all in a meaningful way.
+//  This in particular affects operator[], at(), find() and substr().
+//  The code makes no effort in preventing these or generating warnings when
+//  these are used on mpt::ustring objects. However, compiling in the
+//  respectively other mpt::ustring mode will catch most of these anyway.
+
+#if MPT_USTRING_MODE_WIDE
+#if MPT_USTRING_MODE_UTF8
+#error "MPT_USTRING_MODE_WIDE and MPT_USTRING_MODE_UTF8 are mutually exclusive."
+#endif
+
+using ustring = std::wstring;
+using uchar = wchar_t;
+#define MPT_UCHAR(x)    L##x
+#define MPT_ULITERAL(x) L##x
+#define MPT_USTRING(x)  std::wstring(L##x)
+
+#endif // MPT_USTRING_MODE_WIDE
+
+#if MPT_USTRING_MODE_UTF8
+#if MPT_USTRING_MODE_WIDE
+#error "MPT_USTRING_MODE_WIDE and MPT_USTRING_MODE_UTF8 are mutually exclusive."
+#endif
+
+using ustring = mpt::u8string;
+using uchar = mpt::u8char;
+#define MPT_UCHAR(x)    MPT_U8CHAR(x)
+#define MPT_ULITERAL(x) MPT_U8LITERAL(x)
+#define MPT_USTRING(x)  MPT_U8STRING(x)
+
+#endif // MPT_USTRING_MODE_UTF8
+
+
+
+template <typename T>
+struct make_string_type { };
+
+template <typename T, typename Ttraits>
+struct make_string_type<std::basic_string<T, Ttraits>> {
+	using type = std::basic_string<T, Ttraits>;
+};
+
+template <typename T>
+struct make_string_type<const T *> {
+	using type = std::basic_string<T>;
+};
+
+template <typename T>
+struct make_string_type<T *> {
+	using type = std::basic_string<T>;
+};
+
+template <typename T, std::size_t N>
+struct make_string_type<T[N]> {
+	using type = typename make_string_type<T *>::type;
+};
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct make_string_type<CStringW> {
+	using type = CStringW;
+};
+
+template <>
+struct make_string_type<CStringA> {
+	using type = CStringA;
+};
+
+#endif // MPT_DETECTED_MFC
+
+
+
+template <typename T>
+struct is_string_type : public std::false_type { };
+template <>
+struct is_string_type<std::string> : public std::true_type { };
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct is_string_type<std::wstring> : public std::true_type { };
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct is_string_type<std::u8string> : public std::true_type { };
+#endif // C++20
+template <>
+struct is_string_type<std::u16string> : public std::true_type { };
+template <>
+struct is_string_type<std::u32string> : public std::true_type { };
+#if MPT_DETECTED_MFC
+template <>
+struct is_string_type<CStringW> : public std::true_type { };
+template <>
+struct is_string_type<CStringA> : public std::true_type { };
+#endif // MPT_DETECTED_MFC
+template <typename T, typename Ttraits>
+struct is_string_type<std::basic_string<T, Ttraits>> : public std::true_type { };
+
+
+
+template <typename T>
+inline typename mpt::make_string_type<T>::type as_string(const T & str) {
+	if constexpr (std::is_pointer<typename std::remove_cv<T>::type>::value) {
+		return str ? typename mpt::make_string_type<T>::type{str} : typename mpt::make_string_type<T>::type{};
+	} else {
+		return str;
+	}
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TYPES_HPP

Property changes on: src/mpt/string/types.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/utility.hpp
===================================================================
--- src/mpt/string/utility.hpp	(nonexistent)
+++ src/mpt/string/utility.hpp	(working copy)
@@ -0,0 +1,334 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_UTILITY_HPP
+#define MPT_STRING_UTILITY_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+// string_traits abstract the API of underlying string classes, in particular they allow adopting to CString without having to specialize for CString explicitly
+
+template <typename Tstring>
+struct string_traits {
+
+	using string_type = Tstring;
+	using size_type = typename string_type::size_type;
+	using char_type = typename string_type::value_type;
+
+	static inline std::size_t length(const string_type & str) {
+		return str.length();
+	}
+
+	static inline void reserve(string_type & str, std::size_t size) {
+		str.reserve(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		return str.append(a);
+	}
+	static inline string_type & append(string_type & str, string_type && a) {
+		return str.append(std::move(a));
+	}
+	static inline string_type & append(string_type & str, std::size_t count, char_type c) {
+		return str.append(count, c);
+	}
+
+	static inline string_type pad(string_type str, std::size_t left, std::size_t right) {
+		str.insert(str.begin(), left, char_type(' '));
+		str.insert(str.end(), right, char_type(' '));
+		return str;
+	}
+};
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct string_traits<CStringA> {
+
+	using string_type = CStringA;
+	using size_type = int;
+	using char_type = typename CStringA::XCHAR;
+
+	static inline size_type length(const string_type & str) {
+		return str.GetLength();
+	}
+
+	static inline void reserve(string_type & str, size_type size) {
+		str.Preallocate(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		str += a;
+		return str;
+	}
+	static inline string_type & append(string_type & str, size_type count, char_type c) {
+		while (count--) {
+			str.AppendChar(c);
+		}
+		return str;
+	}
+
+	static inline string_type pad(const string_type & str, size_type left, size_type right) {
+		string_type tmp;
+		while (left--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		tmp += str;
+		while (right--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		return tmp;
+	}
+};
+
+template <>
+struct string_traits<CStringW> {
+
+	using string_type = CStringW;
+	using size_type = int;
+	using char_type = typename CStringW::XCHAR;
+
+	static inline size_type length(const string_type & str) {
+		return str.GetLength();
+	}
+
+	static inline void reserve(string_type & str, size_type size) {
+		str.Preallocate(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		str += a;
+		return str;
+	}
+	static inline string_type & append(string_type & str, size_type count, char_type c) {
+		while (count--) {
+			str.AppendChar(c);
+		}
+		return str;
+	}
+
+	static inline string_type pad(const string_type & str, size_type left, size_type right) {
+		string_type tmp;
+		while (left--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		tmp += str;
+		while (right--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		return tmp;
+	}
+};
+
+#endif // MPT_DETECTED_MFC
+
+
+template <typename Tchar>
+struct char_constants {
+	static inline constexpr Tchar space = ' ';
+	static inline constexpr Tchar a = 'a';
+	static inline constexpr Tchar z = 'z';
+	static inline constexpr Tchar A = 'A';
+	static inline constexpr Tchar Z = 'Z';
+	static inline constexpr Tchar lf = '\n';
+	static inline constexpr Tchar cr = '\r';
+	static inline constexpr Tchar tab = '\t';
+	static inline constexpr Tchar comma = ',';
+};
+
+template <>
+struct char_constants<char> {
+	static inline constexpr char space = ' ';
+	static inline constexpr char a = 'a';
+	static inline constexpr char z = 'z';
+	static inline constexpr char A = 'A';
+	static inline constexpr char Z = 'Z';
+	static inline constexpr char lf = '\n';
+	static inline constexpr char cr = '\r';
+	static inline constexpr char tab = '\t';
+	static inline constexpr char comma = ',';
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct char_constants<wchar_t> {
+	static inline constexpr wchar_t space = L' ';
+	static inline constexpr wchar_t a = L'a';
+	static inline constexpr wchar_t z = L'z';
+	static inline constexpr wchar_t A = L'A';
+	static inline constexpr wchar_t Z = L'Z';
+	static inline constexpr wchar_t lf = L'\n';
+	static inline constexpr wchar_t cr = L'\r';
+	static inline constexpr wchar_t tab = L'\t';
+	static inline constexpr wchar_t comma = L',';
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct char_constants<char8_t> {
+	static inline constexpr char8_t space = u8' ';
+	static inline constexpr char8_t a = u8'a';
+	static inline constexpr char8_t z = u8'z';
+	static inline constexpr char8_t A = u8'A';
+	static inline constexpr char8_t Z = u8'Z';
+	static inline constexpr char8_t lf = u8'\n';
+	static inline constexpr char8_t cr = u8'\r';
+	static inline constexpr char8_t tab = u8'\t';
+	static inline constexpr char8_t comma = u8',';
+};
+#endif
+
+template <>
+struct char_constants<char16_t> {
+	static inline constexpr char16_t space = u' ';
+	static inline constexpr char16_t a = u'a';
+	static inline constexpr char16_t z = u'z';
+	static inline constexpr char16_t A = u'A';
+	static inline constexpr char16_t Z = u'Z';
+	static inline constexpr char16_t lf = u'\n';
+	static inline constexpr char16_t cr = u'\r';
+	static inline constexpr char16_t tab = u'\t';
+	static inline constexpr char16_t comma = u',';
+};
+
+template <>
+struct char_constants<char32_t> {
+	static inline constexpr char32_t space = U' ';
+	static inline constexpr char32_t a = U'a';
+	static inline constexpr char32_t z = U'z';
+	static inline constexpr char32_t A = U'A';
+	static inline constexpr char32_t Z = U'Z';
+	static inline constexpr char32_t lf = U'\n';
+	static inline constexpr char32_t cr = U'\r';
+	static inline constexpr char32_t tab = U'\t';
+	static inline constexpr char32_t comma = U',';
+};
+
+
+template <typename Tstring>
+inline Tstring default_whitespace() {
+	Tstring result;
+	result.reserve(4);
+	result.push_back(char_constants<typename Tstring::value_type>::space);
+	result.push_back(char_constants<typename Tstring::value_type>::lf);
+	result.push_back(char_constants<typename Tstring::value_type>::cr);
+	result.push_back(char_constants<typename Tstring::value_type>::tab);
+	return result;
+}
+
+
+// Remove whitespace at start of string
+template <typename Tstring>
+inline Tstring trim_left(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	typename Tstring::size_type pos = str.find_first_not_of(whitespace);
+	if (pos != Tstring::npos) {
+		str.erase(str.begin(), str.begin() + pos);
+	} else if (pos == Tstring::npos && str.length() > 0 && str.find_last_of(whitespace) == str.length() - 1) {
+		return Tstring();
+	}
+	return str;
+}
+
+// Remove whitespace at end of string
+template <typename Tstring>
+inline Tstring trim_right(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	typename Tstring::size_type pos = str.find_last_not_of(whitespace);
+	if (pos != Tstring::npos) {
+		str.erase(str.begin() + pos + 1, str.end());
+	} else if (pos == Tstring::npos && str.length() > 0 && str.find_first_of(whitespace) == 0) {
+		return Tstring();
+	}
+	return str;
+}
+
+// Remove whitespace at start and end of string
+template <typename Tstring>
+inline Tstring trim(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	return trim_right(trim_left(str, whitespace), whitespace);
+}
+
+
+template <typename Tstring, typename Tmatch>
+inline bool starts_with(const Tstring & str, const Tmatch & match) {
+	return (str.find(typename mpt::make_string_type<Tmatch>::type{match}) == 0);
+}
+
+template <typename Tstring, typename Tmatch>
+inline bool ends_with(const Tstring & str, const Tmatch & match) {
+	return (str.rfind(typename mpt::make_string_type<Tmatch>::type{match}) == (str.length() - typename mpt::make_string_type<Tmatch>::type{match}.length()));
+}
+
+
+template <typename Tchar>
+inline constexpr Tchar to_lower_ascii(Tchar c) noexcept {
+	if (char_constants<Tchar>::A <= c && c <= char_constants<Tchar>::Z) {
+		c += char_constants<Tchar>::a - char_constants<Tchar>::A;
+	}
+	return c;
+}
+
+template <typename Tchar>
+inline constexpr Tchar to_upper_ascii(Tchar c) noexcept {
+	if (char_constants<Tchar>::a <= c && c <= char_constants<Tchar>::z) {
+		c -= char_constants<Tchar>::a - char_constants<Tchar>::A;
+	}
+	return c;
+}
+
+
+
+template <typename Tstring>
+inline std::vector<Tstring> split(const Tstring & str, const Tstring & sep = Tstring(1, char_constants<typename Tstring::value_type>::comma)) {
+	std::vector<Tstring> vals;
+	std::size_t pos = 0;
+	while (str.find(sep, pos) != std::string::npos) {
+		vals.push_back(str.substr(pos, str.find(sep, pos) - pos));
+		pos = str.find(sep, pos) + sep.length();
+	}
+	if (!vals.empty() || (str.substr(pos).length() > 0)) {
+		vals.push_back(str.substr(pos));
+	}
+	return vals;
+}
+
+
+
+template <typename Tstring>
+inline Tstring combine(const std::vector<Tstring> & vals, const Tstring & sep = Tstring(1, char_constants<typename Tstring::value_type>::comma)) {
+	Tstring str;
+	for (std::size_t i = 0; i < vals.size(); ++i) {
+		if (i > 0) {
+			str += sep;
+		}
+		str += vals[i];
+	}
+	return str;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_UTILITY_HPP

Property changes on: src/mpt/string/utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/system_error/system_error.hpp
===================================================================
--- src/mpt/system_error/system_error.hpp	(nonexistent)
+++ src/mpt/system_error/system_error.hpp	(working copy)
@@ -0,0 +1,170 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP
+#define MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/format_message.hpp"
+#include "mpt/string/format_message_macros.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+
+#if MPT_OS_WINDOWS
+#include <stdexcept>
+#if MPT_OS_WINDOWS_WINRT
+#include <vector>
+#endif // MPT_OS_WINDOWS_WINRT
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+
+namespace windows {
+
+
+
+inline mpt::ustring GetErrorMessage(DWORD errorCode, HANDLE hModule = NULL) {
+#if MPT_OS_WINDOWS_WINRT
+	std::vector<TCHAR> msgbuf(65536);
+	if (FormatMessage(
+			(hModule ? FORMAT_MESSAGE_FROM_HMODULE : 0) | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+			hModule,
+			errorCode,
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+			msgbuf.data(),
+			mpt::saturate_cast<DWORD>(msgbuf.size()),
+			NULL)
+		== 0)
+	{
+		DWORD e = GetLastError();
+		if ((e == ERROR_NOT_ENOUGH_MEMORY) || (e == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		return {};
+	}
+	return mpt::convert<mpt::ustring>(mpt::winstring{msgbuf.data()});
+#else
+	mpt::ustring message;
+	void * lpMsgBuf = nullptr;
+	if (FormatMessage(
+			FORMAT_MESSAGE_ALLOCATE_BUFFER | (hModule ? FORMAT_MESSAGE_FROM_HMODULE : 0) | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+			hModule,
+			errorCode,
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+			(LPTSTR)&lpMsgBuf,
+			0,
+			NULL)
+		== 0)
+	{
+		DWORD e = GetLastError();
+		if (lpMsgBuf) {
+			LocalFree(lpMsgBuf);
+		}
+		if ((e == ERROR_NOT_ENOUGH_MEMORY) || (e == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		return {};
+	}
+	if (!lpMsgBuf) {
+		return {};
+	}
+	try {
+		message = mpt::convert<mpt::ustring>(mpt::winstring{static_cast<LPTSTR>(lpMsgBuf)});
+	} catch (mpt::out_of_memory e) {
+		LocalFree(lpMsgBuf);
+		mpt::rethrow_out_of_memory(e);
+	}
+	LocalFree(lpMsgBuf);
+	return message;
+#endif
+}
+
+
+class error
+	: public std::runtime_error {
+public:
+	error(DWORD errorCode, HANDLE hModule = NULL)
+		: std::runtime_error(mpt::convert<std::string>(mpt::exception_encoding, MPT_UFORMAT_MESSAGE("Windows Error: 0x{}: {}")(mpt::format<mpt::ustring>::hex0<8>(errorCode), GetErrorMessage(errorCode, hModule)))) {
+		return;
+	}
+};
+
+
+inline HANDLE CheckFileHANDLE(HANDLE handle) {
+	if (handle == INVALID_HANDLE_VALUE) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+	return handle;
+}
+
+
+inline HANDLE CheckHANDLE(HANDLE handle) {
+	if (handle == NULL) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+	return handle;
+}
+
+
+inline void CheckBOOL(BOOL result) {
+	if (result == FALSE) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+}
+
+
+inline void ExpectError(DWORD expected) {
+	DWORD err = ::GetLastError();
+	if (err != expected) {
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+}
+
+
+
+} // namespace windows
+
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP

Property changes on: src/mpt/system_error/system_error.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/test/test.hpp
===================================================================
--- src/mpt/test/test.hpp	(nonexistent)
+++ src/mpt/test/test.hpp	(working copy)
@@ -0,0 +1,549 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_TEST_TEST_HPP
+#define MPT_TEST_TEST_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/source_location.hpp"
+
+#include <functional>
+#include <iostream>
+#include <map>
+#include <sstream>
+#include <stdexcept>
+#include <type_traits>
+#include <typeinfo>
+#include <utility>
+#include <variant>
+
+#include <cstddef>
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace test {
+
+
+
+template <typename S, typename T, typename = void>
+struct is_to_stream_writable : std::false_type { };
+
+template <typename S, typename T>
+struct is_to_stream_writable<S, T, std::void_t<decltype(std::declval<S &>() << std::declval<T>())>> : std::true_type { };
+
+template <typename T>
+inline auto format(const T & x) -> typename std::enable_if<mpt::test::is_to_stream_writable<std::ostringstream, T>::value, std::string>::type {
+	std::ostringstream s;
+	s << x;
+	return s.str();
+}
+
+template <typename T>
+inline auto format(const T & x) -> typename std::enable_if<!mpt::test::is_to_stream_writable<std::ostringstream, T>::value, std::string>::type {
+	return typeid(x).name();
+}
+
+inline std::string get_exception_text() {
+	std::string result;
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		result = e.what();
+	} catch (...) {
+		result = "unknown exception";
+	}
+	return result;
+}
+
+struct result_success {
+};
+struct result_failure {
+	std::string text{};
+};
+struct result_unexpected_exception {
+	std::string text{};
+};
+
+struct result {
+	std::variant<std::monostate, result_success, result_failure, result_unexpected_exception> info{std::monostate{}};
+};
+
+struct statistics_counters {
+	std::size_t total{0};
+	std::size_t run{0};
+	std::size_t successes{0};
+	std::size_t failures{0};
+	std::size_t unexpected_exceptions{0};
+	std::size_t completed{0};
+	constexpr statistics_counters & operator+=(const statistics_counters & other) noexcept {
+		total += other.total;
+		run += other.run;
+		successes += other.successes;
+		failures += other.failures;
+		unexpected_exceptions += other.unexpected_exceptions;
+		completed += other.completed;
+		return *this;
+	}
+};
+
+struct group_statistics {
+	statistics_counters tests{};
+	statistics_counters cases{};
+	statistics_counters local_cases{};
+};
+
+struct global_statistics {
+	statistics_counters groups{};
+	statistics_counters tests{};
+	statistics_counters cases{};
+	std::map<std::string, group_statistics> individual_group_statistics{};
+	explicit constexpr operator bool() noexcept {
+		return succeeded();
+	}
+	constexpr bool operator!() noexcept {
+		return failed();
+	}
+	constexpr bool succeeded() noexcept {
+		return groups.successes == groups.run;
+	}
+	constexpr bool failed() noexcept {
+		return groups.failures > 0 || groups.unexpected_exceptions > 0;
+	}
+};
+
+class reporter_interface {
+protected:
+	virtual ~reporter_interface() = default;
+
+public:
+	virtual void run_begin(const mpt::source_location & loc) = 0;
+	virtual void group_begin(const mpt::source_location & loc, const char * name) = 0;
+	virtual void test_begin(const mpt::source_location & loc, const char * name) = 0;
+	virtual void case_run(const mpt::source_location & loc) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_e) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_ex, const char * text_e) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_a, const char * text_cmp, const char * text_b) = 0;
+	virtual void case_result(const mpt::source_location & loc, const mpt::test::result & result) = 0;
+	virtual void test_end(const mpt::source_location & loc, const char * name, const statistics_counters & counters) = 0;
+	virtual void group_end(const mpt::source_location & loc, const char * name, const group_statistics & statistics) = 0;
+	virtual void run_end(const mpt::source_location & loc, const global_statistics & statistics) = 0;
+	virtual void immediate_breakpoint() = 0;
+};
+
+class silent_reporter
+	: public reporter_interface {
+public:
+	silent_reporter() = default;
+	~silent_reporter() override = default;
+
+public:
+	virtual void run_begin(const mpt::source_location &) override {
+	}
+	virtual void group_begin(const mpt::source_location &, const char *) override {
+	}
+	virtual void test_begin(const mpt::source_location &, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *, const char *, const char *) override {
+	}
+	virtual void case_result(const mpt::source_location &, const mpt::test::result &) override {
+	}
+	virtual void test_end(const mpt::source_location &, const char *, const statistics_counters &) override {
+	}
+	virtual void group_end(const mpt::source_location &, const char *, const group_statistics &) override {
+	}
+	virtual void run_end(const mpt::source_location &, const global_statistics &) override {
+	}
+	virtual void immediate_breakpoint() override {
+	}
+};
+
+class simple_reporter : public reporter_interface {
+private:
+	std::ostream & s;
+
+public:
+	simple_reporter(std::ostream & s_)
+		: s(s_) {
+		s.flush();
+	}
+	~simple_reporter() override {
+		s.flush();
+	}
+
+public:
+	void run_begin(const mpt::source_location & loc) override {
+		static_cast<void>(loc);
+		s << "Running test suite ..." << std::endl;
+	}
+	void group_begin(const mpt::source_location & loc, const char * name) override {
+		static_cast<void>(loc);
+		s << "Running group '" << name << "' ..." << std::endl;
+	}
+	void test_begin(const mpt::source_location & loc, const char * name) override {
+		static_cast<void>(loc);
+		s << " Running test '" << name << "' ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc) override {
+		static_cast<void>(loc);
+		s << "  Checking ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc, const char * text_e) override {
+		static_cast<void>(loc);
+		s << "  Checking '" << text_e << "' ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc, const char * text_ex, const char * text_e) override {
+		static_cast<void>(loc);
+		if (text_ex) {
+			s << "  Checking '" << text_e << " throws " << text_ex << "' ..." << std::endl;
+		} else {
+			s << "  Checking '" << text_e << " throws' ..." << std::endl;
+		}
+	}
+	void case_run(const mpt::source_location & loc, const char * text_a, const char * text_cmp, const char * text_b) override {
+		static_cast<void>(loc);
+		s << "  Checking '" << text_a << " " << text_cmp << " " << text_b << "' ..." << std::endl;
+	}
+	void case_result(const mpt::source_location & loc, const mpt::test::result & result) override {
+		static_cast<void>(loc);
+		s << "  Checking done: ";
+		if (std::holds_alternative<result_success>(result.info)) {
+			s << "Success.";
+		} else if (std::holds_alternative<result_failure>(result.info)) {
+			s << "FAILURE: " << std::get<result_failure>(result.info).text;
+		} else if (std::holds_alternative<result_unexpected_exception>(result.info)) {
+			s << "UNEXPECTED EXCEPTION: " << std::get<result_unexpected_exception>(result.info).text;
+		}
+		s << std::endl;
+	}
+	void test_end(const mpt::source_location & loc, const char * name, const statistics_counters & counters) override {
+		static_cast<void>(loc);
+		static_cast<void>(counters);
+		s << " Running test '" << name << "' done." << std::endl;
+	}
+	void group_end(const mpt::source_location & loc, const char * name, const group_statistics & statistics) override {
+		static_cast<void>(loc);
+		static_cast<void>(statistics);
+		s << "Running group '" << name << "' done." << std::endl;
+	}
+	void run_end(const mpt::source_location & loc, const global_statistics & statistics) override {
+		static_cast<void>(loc);
+		s << "Running test suite done." << std::endl;
+		s << "groups: " << statistics.groups.total << " | " << statistics.groups.successes << " passed";
+		if (statistics.groups.failures || statistics.groups.unexpected_exceptions) {
+			s << " | " << statistics.groups.failures << " FAILED";
+			if (statistics.groups.unexpected_exceptions) {
+				s << " | " << statistics.groups.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+		s << "tests: " << statistics.tests.total << " | " << statistics.tests.successes << " passed";
+		if (statistics.tests.failures || statistics.tests.unexpected_exceptions) {
+			s << " | " << statistics.tests.failures << " FAILED";
+			if (statistics.tests.unexpected_exceptions) {
+				s << " | " << statistics.tests.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+		s << "checks: " << statistics.cases.total << " | " << statistics.cases.successes << " passed";
+		if (statistics.cases.failures || statistics.cases.unexpected_exceptions) {
+			s << " | " << statistics.cases.failures << " FAILED";
+			if (statistics.cases.unexpected_exceptions) {
+				s << " | " << statistics.cases.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+	}
+	void immediate_breakpoint() override {
+		return;
+	}
+};
+
+struct group;
+
+struct context {
+	mpt::test::group & group;
+	mpt::test::reporter_interface & reporter;
+	mpt::test::group_statistics statistics{};
+};
+
+using void_context_function = void (*)(mpt::test::context &);
+
+struct group {
+	group * next{nullptr};
+	const char * name{""};
+	void_context_function func{nullptr};
+	inline group(const char * name_, void_context_function f)
+		: name(name_)
+		, func(f) {
+		next = group_list();
+		group_list() = this;
+	}
+	group_statistics run(mpt::test::reporter_interface & reporter, const mpt::source_location & loc = mpt::source_location::current()) {
+		mpt::test::context context{*this, reporter};
+		context.reporter.group_begin(loc, name);
+		if (func) {
+			func(context);
+		}
+		context.reporter.group_end(loc, name, context.statistics);
+		return context.statistics;
+	}
+
+public:
+	[[nodiscard]] static inline group *& group_list() noexcept {
+		static group * group_list = nullptr;
+		return group_list;
+	}
+};
+
+inline global_statistics run_all(mpt::test::reporter_interface & reporter, const mpt::source_location & loc = mpt::source_location::current()) {
+	global_statistics statistics{};
+	reporter.run_begin(loc);
+	for (group * g = group::group_list(); g; g = g->next) {
+		statistics.groups.total++;
+		statistics.groups.run++;
+		group_statistics s = g->run(reporter, loc);
+		if (s.tests.unexpected_exceptions) {
+			statistics.groups.unexpected_exceptions++;
+		} else if (s.tests.failures) {
+			statistics.groups.failures++;
+		} else {
+			statistics.groups.successes++;
+		}
+		statistics.tests += s.tests;
+		statistics.cases += s.cases;
+		statistics.groups.completed++;
+		statistics.individual_group_statistics[g->name] = s;
+	}
+	reporter.run_end(loc, statistics);
+	return statistics;
+}
+
+struct test {
+
+	mpt::test::context & context;
+	const char * name{""};
+	mpt::source_location source_location{mpt::source_location::current()};
+	void (*breakpoint)(void){nullptr};
+
+	test(const test &) = delete;
+	test & operator=(const test &) = delete;
+
+	inline test(mpt::test::context & context_, void (*breakpoint_)(void) = nullptr, const mpt::source_location & source_location_ = mpt::source_location::current())
+		: context(context_)
+		, source_location(source_location_)
+		, breakpoint(breakpoint_) {
+		report_test_begin();
+	}
+	inline test(mpt::test::context & context_, const char * name_, void (*breakpoint_)(void) = nullptr, const mpt::source_location & source_location_ = mpt::source_location::current())
+		: context(context_)
+		, name(name_)
+		, source_location(source_location_)
+		, breakpoint(breakpoint_) {
+		report_test_begin();
+	}
+
+	inline ~test() {
+		report_test_end();
+	}
+
+	void immediate_breakpoint() {
+		if (breakpoint) {
+			breakpoint();
+		} else {
+			context.reporter.immediate_breakpoint();
+		}
+	}
+
+	void report_test_begin() {
+		context.statistics.tests.total++;
+		context.statistics.tests.run++;
+		context.statistics.local_cases = statistics_counters{};
+		context.reporter.test_begin(source_location, name);
+	}
+
+	void report_run() {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location);
+	}
+	void report_run(const char * text_e) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_e);
+	}
+	void report_run(const char * text_ex, const char * text_e) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_ex, text_e);
+	}
+	void report_run(const char * text_a, const char * text_cmp, const char * text_b) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_a, text_cmp, text_b);
+	}
+
+	void report_result(mpt::test::result result) {
+		if (std::holds_alternative<result_success>(result.info)) {
+			context.statistics.local_cases.successes++;
+		} else if (std::holds_alternative<result_failure>(result.info)) {
+			context.statistics.local_cases.failures++;
+		} else if (std::holds_alternative<result_unexpected_exception>(result.info)) {
+			context.statistics.local_cases.unexpected_exceptions++;
+		}
+		context.statistics.local_cases.completed++;
+		context.reporter.case_result(source_location, result);
+	}
+
+	void report_test_end() {
+		context.statistics.cases += context.statistics.local_cases;
+		if (context.statistics.local_cases.unexpected_exceptions) {
+			context.statistics.tests.unexpected_exceptions++;
+		} else if (context.statistics.local_cases.failures) {
+			context.statistics.tests.failures++;
+		} else {
+			context.statistics.tests.successes++;
+		}
+		context.statistics.tests.completed++;
+		context.reporter.test_end(source_location, name, context.statistics.local_cases);
+	}
+
+	template <typename Texception, typename Tcallable, typename std::enable_if<std::is_invocable<Tcallable>::value, bool>::type = true>
+	inline test & expect_throws(Tcallable c, const char * text_ex = nullptr, const char * text_e = nullptr) {
+		report_run(text_ex ? text_ex : typeid(Texception).name(), text_e ? text_e : typeid(decltype(c())).name());
+		mpt::test::result result;
+		try {
+			c();
+			immediate_breakpoint();
+			result.info = mpt::test::result_failure{};
+		} catch (const Texception &) {
+			result.info = mpt::test::result_success{};
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Tcallable, typename std::enable_if<std::is_invocable<Tcallable>::value, bool>::type = true>
+	inline test & expect_throws_any(Tcallable c, const char * text_e = nullptr) {
+		report_run(nullptr, text_e ? text_e : typeid(decltype(c())).name());
+		mpt::test::result result;
+		try {
+			c();
+			immediate_breakpoint();
+			result.info = mpt::test::result_failure{};
+		} catch (...) {
+			result.info = mpt::test::result_success{};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Texpr, typename std::enable_if<std::is_invocable<Texpr>::value, bool>::type = true>
+	inline test & expect(Texpr e, const char * text_e = nullptr) {
+		report_run(text_e ? text_e : typeid(decltype(std::invoke(e))).name());
+		mpt::test::result result;
+		try {
+			const auto ve = std::invoke(e);
+			if (!ve) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{/*mpt::test::format(ve)*/};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Ta, typename Tcmp, typename Tb, typename std::enable_if<std::is_invocable<Ta>::value, bool>::type = true, typename std::enable_if<std::is_invocable<Tb>::value, bool>::type = true>
+	inline test & expect(Ta && a, Tcmp cmp, Tb && b, const char * text_a = nullptr, const char * text_cmp = nullptr, const char * text_b = nullptr) {
+		report_run(text_a ? text_a : typeid(decltype(std::invoke(a))).name(), text_cmp ? text_cmp : typeid(decltype(cmp)).name(), text_b ? text_b : typeid(decltype(std::invoke(b))).name());
+		mpt::test::result result;
+		try {
+			const auto va = std::invoke(a);
+			const auto vb = std::invoke(b);
+			if (!cmp(va, vb)) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{mpt::test::format(va) + " " + mpt::test::format(cmp) + " " + mpt::test::format(vb)};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Texpr, typename std::enable_if<!std::is_invocable<Texpr>::value, bool>::type = true>
+	inline test & expect(Texpr && e, const char * text_e = nullptr) {
+		report_run(text_e ? text_e : typeid(decltype(std::forward<Texpr>(e))).name());
+		mpt::test::result result;
+		try {
+			const auto ve = std::forward<Texpr>(e);
+			if (!ve) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{/*mpt::test::format(ve)*/};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Ta, typename Tcmp, typename Tb, typename std::enable_if<!std::is_invocable<Ta>::value, bool>::type = true, typename std::enable_if<!std::is_invocable<Tb>::value, bool>::type = true>
+	inline test & expect(Ta && a, Tcmp cmp, Tb && b, const char * text_a = nullptr, const char * text_cmp = nullptr, const char * text_b = nullptr) {
+		report_run(text_a ? text_a : typeid(decltype(std::forward<Ta>(a))).name(), text_cmp ? text_cmp : typeid(decltype(cmp)).name(), text_b ? text_b : typeid(decltype(std::forward<Tb>(b))).name());
+		mpt::test::result result;
+		try {
+			const auto va = std::forward<Ta>(a);
+			const auto vb = std::forward<Tb>(b);
+			if (!cmp(va, vb)) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{mpt::test::format(va) + " " + mpt::test::format(cmp) + " " + mpt::test::format(vb)};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+};
+
+
+} // namespace test
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_TEST_TEST_HPP

Property changes on: src/mpt/test/test.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/test/test_macros.hpp
===================================================================
--- src/mpt/test/test_macros.hpp	(nonexistent)
+++ src/mpt/test/test_macros.hpp	(working copy)
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_TEST_TEST_MACROS_HPP
+#define MPT_TEST_TEST_MACROS_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/preprocessor.hpp"
+#include "mpt/test/test.hpp"
+
+#include <functional>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace test {
+
+
+#define MPT_TEST_GROUP_BEGIN(name) \
+	inline mpt::test::group MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_name) { \
+		name, [](mpt::test::context & context) {
+#define MPT_TEST_GROUP_END() \
+	} \
+	} \
+	;
+
+// #define MPT_TEST_GROUP(name) inline void MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(mpt::test::context & context); inline mpt::test::group MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_name){name, [](mpt::test::context & context) { MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(context); }}; inline void MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(mpt::test::context & context)
+
+#define MPT_TEST_DELAYED(x) [&] { \
+	return x; \
+}
+
+#define MPT_TEST_EXPECT mpt::test::test{context}.expect
+
+#define MPT_TEST_EXPECT_EXPR(e)                 mpt::test::test{context}.expect([&] { return e; }, #e)
+#define MPT_TEST_EXPECT_CMP(a, cmp, b)          mpt::test::test{context}.expect([&] { return a; }, [](const auto & a_, const auto & b_) { return a_ cmp b_; }, [&] { return b; }, #a, #cmp, #b)
+#define MPT_TEST_EXPECT_THROWS_ANY(expr)        mpt::test::test{context}.expect_throws_any([&] { expr; }, #expr)
+#define MPT_TEST_EXPECT_THROWS(exception, expr) mpt::test::test{context}.expect_throws<exception>([&] { expr; }, #exception, #expr)
+
+#define MPT_TEST_EXPECT_EQUAL(a, b) mpt::test::test{context}.expect([&] { return a; }, std::equal_to<>{}, [&] { return b; }, #a, "==", #b)
+
+
+} // namespace test
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_TEST_TEST_MACROS_HPP

Property changes on: src/mpt/test/test_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/guid.hpp
===================================================================
--- src/mpt/uuid/guid.hpp	(nonexistent)
+++ src/mpt/uuid/guid.hpp	(working copy)
@@ -0,0 +1,284 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_GUID_HPP
+#define MPT_UUID_GUID_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <stdexcept>
+#include <vector>
+
+#if MPT_OS_WINDOWS
+#include <guiddef.h>
+#include <objbase.h>
+#include <rpc.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+
+// COM CLSID<->string conversion
+// A CLSID string is not necessarily a standard UUID string,
+// it might also be a symbolic name for the interface.
+// (see CLSIDFromString ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms680589%28v=vs.85%29.aspx ))
+
+inline mpt::winstring CLSIDToString(CLSID clsid) {
+	std::wstring str;
+	LPOLESTR tmp = nullptr;
+	switch (::StringFromCLSID(clsid, &tmp)) {
+		case S_OK:
+			break;
+		case E_OUTOFMEMORY:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			mpt::throw_out_of_memory();
+			break;
+		default:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			throw std::logic_error("StringFromCLSID() failed.");
+			break;
+	}
+	if (!tmp) {
+		throw std::logic_error("StringFromCLSID() failed.");
+	}
+	try {
+		str = tmp;
+	} catch (mpt::out_of_memory e) {
+		::CoTaskMemFree(tmp);
+		tmp = nullptr;
+		mpt::rethrow_out_of_memory(e);
+	}
+	::CoTaskMemFree(tmp);
+	tmp = nullptr;
+	return mpt::convert<mpt::winstring>(str);
+}
+
+inline CLSID StringToCLSID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	CLSID clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			// nothing
+			break;
+		case E_INVALIDARG:
+			clsid = CLSID();
+			break;
+		case CO_E_CLASSSTRING:
+			clsid = CLSID();
+			break;
+		case REGDB_E_CLASSNOTREG:
+			clsid = CLSID();
+			break;
+		case REGDB_E_READREGDB:
+			clsid = CLSID();
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			clsid = CLSID();
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return clsid;
+}
+
+inline bool VerifyStringToCLSID(const mpt::winstring & str_, CLSID & clsid) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	bool result = false;
+	clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			result = true;
+			break;
+		case E_INVALIDARG:
+			result = false;
+			break;
+		case CO_E_CLASSSTRING:
+			result = false;
+			break;
+		case REGDB_E_CLASSNOTREG:
+			result = false;
+			break;
+		case REGDB_E_READREGDB:
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return result;
+}
+
+inline bool IsCLSID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	bool result = false;
+	CLSID clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			result = true;
+			break;
+		case E_INVALIDARG:
+			result = false;
+			break;
+		case CO_E_CLASSSTRING:
+			result = false;
+			break;
+		case REGDB_E_CLASSNOTREG:
+			result = false;
+			break;
+		case REGDB_E_READREGDB:
+			result = false;
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			result = false;
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return result;
+}
+
+
+// COM IID<->string conversion
+
+inline IID StringToIID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	IID iid = IID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::IIDFromString(tmp.data(), &iid)) {
+		case S_OK:
+			// nothing
+			break;
+		case E_OUTOFMEMORY:
+			iid = IID();
+			mpt::throw_out_of_memory();
+			break;
+		case E_INVALIDARG:
+			iid = IID();
+			break;
+		default:
+			iid = IID();
+			throw std::logic_error("IIDFromString() failed.");
+			break;
+	}
+	return iid;
+}
+
+inline mpt::winstring IIDToString(IID iid) {
+	std::wstring str;
+	LPOLESTR tmp = nullptr;
+	switch (::StringFromIID(iid, &tmp)) {
+		case S_OK:
+			break;
+		case E_OUTOFMEMORY:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			mpt::throw_out_of_memory();
+			break;
+		default:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			throw std::logic_error("StringFromIID() failed.");
+			break;
+	}
+	if (!tmp) {
+		throw std::logic_error("StringFromIID() failed.");
+	}
+	try {
+		str = tmp;
+	} catch (mpt::out_of_memory e) {
+		::CoTaskMemFree(tmp);
+		tmp = nullptr;
+		mpt::rethrow_out_of_memory(e);
+	}
+	return mpt::convert<mpt::winstring>(str);
+}
+
+
+// General GUID<->string conversion.
+// The string must/will be in standard GUID format: {4F9A455D-E7EF-4367-B2F0-0C83A38A5C72}
+
+inline GUID StringToGUID(const mpt::winstring & str) {
+	return StringToIID(str);
+}
+
+inline mpt::winstring GUIDToString(GUID guid) {
+	std::vector<OLECHAR> tmp(256);
+	if (::StringFromGUID2(guid, tmp.data(), static_cast<int>(tmp.size())) <= 0) {
+		throw std::logic_error("StringFromGUID2() failed.");
+	}
+	return mpt::convert<mpt::winstring>(tmp.data());
+}
+
+
+// Create a COM GUID
+
+inline GUID CreateGUID() {
+	GUID guid = GUID();
+	switch (::CoCreateGuid(&guid)) {
+		case S_OK:
+			// nothing
+			break;
+		default:
+			guid = GUID();
+			throw std::runtime_error("CoCreateGuid() failed.");
+	}
+	return guid;
+}
+
+
+// Checks the UUID against the NULL UUID. Returns false if it is NULL, true otherwise.
+
+inline bool IsValid(::UUID uuid) {
+	return false
+		|| uuid.Data1 != 0
+		|| uuid.Data2 != 0
+		|| uuid.Data3 != 0
+		|| uuid.Data4[0] != 0
+		|| uuid.Data4[1] != 0
+		|| uuid.Data4[2] != 0
+		|| uuid.Data4[3] != 0
+		|| uuid.Data4[4] != 0
+		|| uuid.Data4[5] != 0
+		|| uuid.Data4[6] != 0
+		|| uuid.Data4[7] != 0;
+}
+
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_GUID_HPP

Property changes on: src/mpt/uuid/guid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/tests/tests_uuid.hpp
===================================================================
--- src/mpt/uuid/tests/tests_uuid.hpp	(nonexistent)
+++ src/mpt/uuid/tests/tests_uuid.hpp	(working copy)
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_UUID_HPP
+#define MPT_BASE_TESTS_UUID_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+#include "mpt/uuid/guid.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <cstddef>
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_uuid{
+	"mpt/uuid",
+	[](mpt::test::context & context) {
+		using namespace mpt::uuid_literals;
+
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull).ToUString(), MPT_USTRING("2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"));
+#if MPT_OS_WINDOWS
+		constexpr mpt::UUID uuid_tmp = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid_tmp);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(mpt::StringToGUID(TEXT("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(mpt::StringToCLSID(TEXT("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull), mpt::UUID(mpt::StringToGUID(TEXT("{00112233-4455-6677-8899-AABBCCDDEEFF}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull), mpt::UUID(mpt::StringToGUID(TEXT("{00112233-4455-6677-C899-AABBCCDDEEFF}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull)), TEXT("{00112233-4455-6677-8899-AABBCCDDEEFF}"));
+		MPT_TEST_EXPECT_EQUAL(mpt::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull)), TEXT("{00112233-4455-6677-C899-AABBCCDDEEFF}"));
+#endif // MPT_OS_WINDOWS
+
+		mpt::sane_random_device rd;
+		mpt::good_engine prng = mpt::make_prng<mpt::good_engine>(rd);
+
+#if MPT_OS_WINDOWS
+		MPT_TEST_EXPECT_EQUAL(mpt::IsValid(mpt::CreateGUID()), true);
+		{
+			mpt::UUID uuid = mpt::UUID::Generate(prng);
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID::FromString(mpt::UUID(uuid).ToUString()));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToGUID(mpt::GUIDToString(uuid))));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToIID(mpt::IIDToString(uuid))));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToCLSID(mpt::CLSIDToString(uuid))));
+		}
+		{
+			GUID guid = mpt::UUID::Generate(prng);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, static_cast<GUID>(mpt::UUID::FromString(mpt::UUID(guid).ToUString()))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToGUID(mpt::GUIDToString(guid))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToIID(mpt::IIDToString(guid))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToCLSID(mpt::CLSIDToString(guid))), TRUE);
+		}
+#endif // MPT_OS_WINDOWS
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::Generate(prng).IsValid(), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::GenerateLocalUseOnly(prng).IsValid(), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::Generate(prng) != mpt::UUID::Generate(prng), true);
+		mpt::UUID a = mpt::UUID::Generate(prng);
+		MPT_TEST_EXPECT_EQUAL(a, mpt::UUID::FromString(a.ToUString()));
+		std::byte uuiddata[16]{};
+		for (std::size_t i = 0; i < 16; ++i) {
+			uuiddata[i] = mpt::byte_cast<std::byte>(static_cast<uint8>(i));
+		}
+		static_assert(sizeof(mpt::UUID) == 16);
+		mpt::UUIDbin uuid2;
+		std::memcpy(&uuid2, uuiddata, 16);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(uuid2).ToUString(), MPT_USTRING("00010203-0405-0607-0809-0a0b0c0d0e0f"));
+
+		constexpr mpt::UUID uuid3 = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid3);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_UUID_HPP

Property changes on: src/mpt/uuid/tests/tests_uuid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/uuid.hpp
===================================================================
--- src/mpt/uuid/uuid.hpp	(nonexistent)
+++ src/mpt/uuid/uuid.hpp	(working copy)
@@ -0,0 +1,386 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_UUID_HPP
+#define MPT_UUID_UUID_HPP
+
+
+
+#include "mpt/base/constexpr_throw.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/random/random.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/parse.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#if MPT_OS_WINDOWS
+#include <guiddef.h>
+#include <objbase.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Microsoft on-disk layout
+struct GUIDms {
+	uint32le Data1;
+	uint16le Data2;
+	uint16le Data3;
+	uint64be Data4; // yes, big endian here
+};
+constexpr bool declare_binary_safe(const GUIDms &) {
+	return true;
+}
+static_assert(mpt::check_binary_size<GUIDms>(16));
+
+// RFC binary format
+struct UUIDbin {
+	uint32be Data1;
+	uint16be Data2;
+	uint16be Data3;
+	uint64be Data4;
+};
+constexpr bool declare_binary_safe(const UUIDbin &) {
+	return true;
+}
+static_assert(mpt::check_binary_size<UUIDbin>(16));
+
+
+
+struct UUID {
+private:
+	uint32 Data1;
+	uint16 Data2;
+	uint16 Data3;
+	uint64 Data4;
+
+public:
+	MPT_CONSTEXPRINLINE uint32 GetData1() const noexcept {
+		return Data1;
+	}
+	MPT_CONSTEXPRINLINE uint16 GetData2() const noexcept {
+		return Data2;
+	}
+	MPT_CONSTEXPRINLINE uint16 GetData3() const noexcept {
+		return Data3;
+	}
+	MPT_CONSTEXPRINLINE uint64 GetData4() const noexcept {
+		return Data4;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE uint64 GetData64_1() const noexcept {
+		return (static_cast<uint64>(Data1) << 32) | (static_cast<uint64>(Data2) << 16) | (static_cast<uint64>(Data3) << 0);
+	}
+	MPT_CONSTEXPRINLINE uint64 GetData64_2() const noexcept {
+		return Data4;
+	}
+
+public:
+	// xxxxxxxx-xxxx-Mmxx-Nnxx-xxxxxxxxxxxx
+	// <--32-->-<16>-<16>-<-------64------>
+	MPT_CONSTEXPRINLINE bool IsNil() const noexcept {
+		return (Data1 == 0) && (Data2 == 0) && (Data3 == 0) && (Data4 == 0);
+	}
+	MPT_CONSTEXPRINLINE bool IsValid() const noexcept {
+		return (Data1 != 0) || (Data2 != 0) || (Data3 != 0) || (Data4 != 0);
+	}
+	MPT_CONSTEXPRINLINE uint8 Variant() const noexcept {
+		return Nn() >> 4u;
+	}
+	MPT_CONSTEXPRINLINE uint8 Version() const noexcept {
+		return Mm() >> 4u;
+	}
+	MPT_CONSTEXPRINLINE bool IsRFC4122() const noexcept {
+		return (Variant() & 0xcu) == 0x8u;
+	}
+
+private:
+	MPT_CONSTEXPRINLINE uint8 Mm() const noexcept {
+		return static_cast<uint8>((Data3 >> 8) & 0xffu);
+	}
+	MPT_CONSTEXPRINLINE uint8 Nn() const noexcept {
+		return static_cast<uint8>((Data4 >> 56) & 0xffu);
+	}
+	void MakeRFC4122(uint8 version) noexcept {
+		// variant
+		uint8 Nn = static_cast<uint8>((Data4 >> 56) & 0xffu);
+		Data4 &= 0x00ffffffffffffffull;
+		Nn &= ~(0xc0u);
+		Nn |= 0x80u;
+		Data4 |= static_cast<uint64>(Nn) << 56;
+		// version
+		version &= 0x0fu;
+		uint8 Mm = static_cast<uint8>((Data3 >> 8) & 0xffu);
+		Data3 &= 0x00ffu;
+		Mm &= ~(0xf0u);
+		Mm |= (version << 4u);
+		Data3 |= static_cast<uint16>(Mm) << 8;
+	}
+#if MPT_OS_WINDOWS
+private:
+	static mpt::UUID UUIDFromWin32(::UUID uuid) {
+		return mpt::UUID(uuid.Data1, uuid.Data2, uuid.Data3, (static_cast<uint64>(0) | (static_cast<uint64>(uuid.Data4[0]) << 56) | (static_cast<uint64>(uuid.Data4[1]) << 48) | (static_cast<uint64>(uuid.Data4[2]) << 40) | (static_cast<uint64>(uuid.Data4[3]) << 32) | (static_cast<uint64>(uuid.Data4[4]) << 24) | (static_cast<uint64>(uuid.Data4[5]) << 16) | (static_cast<uint64>(uuid.Data4[6]) << 8) | (static_cast<uint64>(uuid.Data4[7]) << 0)));
+	}
+	static ::UUID UUIDToWin32(mpt::UUID uuid) {
+		::UUID result = ::UUID();
+		result.Data1 = uuid.GetData1();
+		result.Data2 = uuid.GetData2();
+		result.Data3 = uuid.GetData3();
+		result.Data4[0] = static_cast<uint8>(uuid.GetData4() >> 56);
+		result.Data4[1] = static_cast<uint8>(uuid.GetData4() >> 48);
+		result.Data4[2] = static_cast<uint8>(uuid.GetData4() >> 40);
+		result.Data4[3] = static_cast<uint8>(uuid.GetData4() >> 32);
+		result.Data4[4] = static_cast<uint8>(uuid.GetData4() >> 24);
+		result.Data4[5] = static_cast<uint8>(uuid.GetData4() >> 16);
+		result.Data4[6] = static_cast<uint8>(uuid.GetData4() >> 8);
+		result.Data4[7] = static_cast<uint8>(uuid.GetData4() >> 0);
+		return result;
+	}
+
+public:
+	explicit UUID(::UUID uuid) {
+		*this = UUIDFromWin32(uuid);
+	}
+	operator ::UUID() const {
+		return UUIDToWin32(*this);
+	}
+#endif // MPT_OS_WINDOWS
+private:
+	static MPT_CONSTEXPRINLINE uint8 NibbleFromChar(char x) {
+		return ('0' <= x && x <= '9') ? static_cast<uint8>(x - '0' + 0) : ('a' <= x && x <= 'z') ? static_cast<uint8>(x - 'a' + 10)
+			: ('A' <= x && x <= 'Z')                                                             ? static_cast<uint8>(x - 'A' + 10)
+																								 : mpt::constexpr_throw<uint8>(std::domain_error(""));
+	}
+	static MPT_CONSTEXPRINLINE uint8 ByteFromHex(char x, char y) {
+		return static_cast<uint8>(uint8(0) | (NibbleFromChar(x) << 4) | (NibbleFromChar(y) << 0));
+	}
+	static MPT_CONSTEXPRINLINE uint16 ParseHex16(const char * str) {
+		return static_cast<uint16>(uint16(0) | (static_cast<uint16>(ByteFromHex(str[0], str[1])) << 8) | (static_cast<uint16>(ByteFromHex(str[2], str[3])) << 0));
+	}
+	static MPT_CONSTEXPRINLINE uint32 ParseHex32(const char * str) {
+		return static_cast<uint32>(uint32(0) | (static_cast<uint32>(ByteFromHex(str[0], str[1])) << 24) | (static_cast<uint32>(ByteFromHex(str[2], str[3])) << 16) | (static_cast<uint32>(ByteFromHex(str[4], str[5])) << 8) | (static_cast<uint32>(ByteFromHex(str[6], str[7])) << 0));
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE UUID ParseLiteral(const char * str, std::size_t len) {
+		return (len == 36 && str[8] == '-' && str[13] == '-' && str[18] == '-' && str[23] == '-') ? mpt::UUID(
+				   ParseHex32(str + 0),
+				   ParseHex16(str + 9),
+				   ParseHex16(str + 14),
+				   uint64(0)
+					   | (static_cast<uint64>(ParseHex16(str + 19)) << 48)
+					   | (static_cast<uint64>(ParseHex16(str + 24)) << 32)
+					   | (static_cast<uint64>(ParseHex32(str + 28)) << 0))
+																								  : mpt::constexpr_throw<mpt::UUID>(std::domain_error(""));
+	}
+
+public:
+	MPT_CONSTEXPRINLINE UUID() noexcept
+		: Data1(0)
+		, Data2(0)
+		, Data3(0)
+		, Data4(0) {
+		return;
+	}
+	MPT_CONSTEXPRINLINE explicit UUID(uint32 Data1, uint16 Data2, uint16 Data3, uint64 Data4) noexcept
+		: Data1(Data1)
+		, Data2(Data2)
+		, Data3(Data3)
+		, Data4(Data4) {
+		return;
+	}
+	explicit UUID(UUIDbin uuid) {
+		Data1 = uuid.Data1.get();
+		Data2 = uuid.Data2.get();
+		Data3 = uuid.Data3.get();
+		Data4 = uuid.Data4.get();
+	}
+	explicit UUID(GUIDms guid) {
+		Data1 = guid.Data1.get();
+		Data2 = guid.Data2.get();
+		Data3 = guid.Data3.get();
+		Data4 = guid.Data4.get();
+	}
+	operator UUIDbin() const {
+		UUIDbin result{};
+		result.Data1 = GetData1();
+		result.Data2 = GetData2();
+		result.Data3 = GetData3();
+		result.Data4 = GetData4();
+		return result;
+	}
+	operator GUIDms() const {
+		GUIDms result{};
+		result.Data1 = GetData1();
+		result.Data2 = GetData2();
+		result.Data3 = GetData3();
+		result.Data4 = GetData4();
+		return result;
+	}
+
+public:
+	// Create a UUID
+	template <typename Trng>
+	static UUID Generate(Trng & rng) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+#if (_WIN32_WINNT >= 0x0602)
+		::GUID guid = ::GUID();
+		HRESULT result = CoCreateGuid(&guid);
+		if (result != S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(guid);
+#else
+		return mpt::UUID::RFC4122Random(rng);
+#endif
+#elif MPT_OS_WINDOWS && !MPT_OS_WINDOWS_WINRT
+		::UUID uuid = ::UUID();
+		RPC_STATUS status = ::UuidCreate(&uuid);
+		if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		status = RPC_S_OK;
+		if (UuidIsNil(&uuid, &status) != FALSE) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		if (status != RPC_S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(uuid);
+#else
+		return RFC4122Random(rng);
+#endif
+	}
+	// Create a UUID that contains local, traceable information.
+	// Safe for local use. May be faster.
+	template <typename Trng>
+	static UUID GenerateLocalUseOnly(Trng & rng) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+#if (_WIN32_WINNT >= 0x0602)
+		::GUID guid = ::GUID();
+		HRESULT result = CoCreateGuid(&guid);
+		if (result != S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(guid);
+#else
+		return mpt::UUID::RFC4122Random(rng);
+#endif
+#elif MPT_OS_WINDOWS && !MPT_OS_WINDOWS_WINRT
+#if _WIN32_WINNT >= 0x0501
+		// Available since Win2000, but we check for WinXP in order to not use this
+		// function in Win32old builds. It is not available on some non-fully
+		// patched Win98SE installs in the wild.
+		::UUID uuid = ::UUID();
+		RPC_STATUS status = ::UuidCreateSequential(&uuid);
+		if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) {
+			return Generate(rng);
+		}
+		status = RPC_S_OK;
+		if (UuidIsNil(&uuid, &status) != FALSE) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		if (status != RPC_S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(uuid);
+#else
+		// Fallback to ::UuidCreate is safe as ::UuidCreateSequential is only a
+		// tiny performance optimization.
+		return Generate(rng);
+#endif
+#else
+		return RFC4122Random(rng);
+#endif
+	}
+	// Create a RFC4122 Random UUID.
+	template <typename Trng>
+	static UUID RFC4122Random(Trng & prng) {
+		UUID result;
+		result.Data1 = mpt::random<uint32>(prng);
+		result.Data2 = mpt::random<uint16>(prng);
+		result.Data3 = mpt::random<uint16>(prng);
+		result.Data4 = mpt::random<uint64>(prng);
+		result.MakeRFC4122(4);
+		return result;
+	}
+	friend UUID UUIDRFC4122NamespaceV3(const UUID & ns, const mpt::ustring & name);
+	friend UUID UUIDRFC4122NamespaceV5(const UUID & ns, const mpt::ustring & name);
+
+public:
+	// General UUID<->string conversion.
+	// The string must/will be in standard UUID format: 4f9a455d-e7ef-4367-b2f0-0c83a38a5c72
+	static UUID FromString(const mpt::ustring & str) {
+		std::vector<mpt::ustring> segments = mpt::split<mpt::ustring>(str, MPT_ULITERAL("-"));
+		if (segments.size() != 5) {
+			return UUID();
+		}
+		if (segments[0].length() != 8) {
+			return UUID();
+		}
+		if (segments[1].length() != 4) {
+			return UUID();
+		}
+		if (segments[2].length() != 4) {
+			return UUID();
+		}
+		if (segments[3].length() != 4) {
+			return UUID();
+		}
+		if (segments[4].length() != 12) {
+			return UUID();
+		}
+		UUID result;
+		result.Data1 = mpt::ConvertHexStringTo<uint32>(segments[0]);
+		result.Data2 = mpt::ConvertHexStringTo<uint16>(segments[1]);
+		result.Data3 = mpt::ConvertHexStringTo<uint16>(segments[2]);
+		result.Data4 = mpt::ConvertHexStringTo<uint64>(segments[3] + segments[4]);
+		return result;
+	}
+	mpt::ustring ToUString() const {
+		return mpt::ustring()
+			+ mpt::format<mpt::ustring>::hex0<8>(GetData1())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(GetData2())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(GetData3())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 48))
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 32))
+			+ mpt::format<mpt::ustring>::hex0<8>(static_cast<uint32>(GetData4() >> 0));
+	}
+};
+
+MPT_CONSTEXPRINLINE bool operator==(const mpt::UUID & a, const mpt::UUID & b) noexcept {
+	return (a.GetData1() == b.GetData1()) && (a.GetData2() == b.GetData2()) && (a.GetData3() == b.GetData3()) && (a.GetData4() == b.GetData4());
+}
+
+MPT_CONSTEXPRINLINE bool operator!=(const mpt::UUID & a, const mpt::UUID & b) noexcept {
+	return (a.GetData1() != b.GetData1()) || (a.GetData2() != b.GetData2()) || (a.GetData3() != b.GetData3()) || (a.GetData4() != b.GetData4());
+}
+
+
+namespace uuid_literals {
+
+MPT_CONSTEXPRINLINE mpt::UUID operator"" _uuid(const char * str, std::size_t len) {
+	return mpt::UUID::ParseLiteral(str, len);
+}
+
+} // namespace uuid_literals
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_UUID_HPP

Property changes on: src/mpt/uuid/uuid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
===================================================================
--- src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp	(nonexistent)
+++ src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp	(working copy)
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_UUID_NAMESPACE_HPP
+#define MPT_BASE_TESTS_UUID_NAMESPACE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+#include "mpt/uuid/uuid.hpp"
+#include "mpt/uuid_namespace/uuid_namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_uuid_namespace{
+	"mpt/uuid_namespace",
+	[](mpt::test::context & context) {
+		{
+			constexpr mpt::UUID uuid_ns_dns = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"_uuid;
+			constexpr mpt::UUID expected = "74738ff5-5367-5958-9aee-98fffdcd1876"_uuid;
+			mpt::UUID gotten = mpt::UUIDRFC4122NamespaceV5(uuid_ns_dns, MPT_USTRING("www.example.org"));
+			MPT_TEST_EXPECT_EQUAL(gotten, expected);
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_UUID_NAMESPACE_HPP

Property changes on: src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid_namespace/uuid_namespace.hpp
===================================================================
--- src/mpt/uuid_namespace/uuid_namespace.hpp	(nonexistent)
+++ src/mpt/uuid_namespace/uuid_namespace.hpp	(working copy)
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP
+#define MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <algorithm>
+#include <array>
+#include <string>
+#include <vector>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+// Create a RFC4122 Version 3 namespace UUID
+inline mpt::UUID UUIDRFC4122NamespaceV3(const mpt::UUID & ns, const mpt::ustring & name) {
+	mpt::UUIDbin binns = ns;
+	std::vector<std::byte> buf;
+	buf.resize(sizeof(mpt::UUIDbin));
+	std::copy(mpt::as_raw_memory(binns).data(), mpt::as_raw_memory(binns).data() + sizeof(mpt::UUIDbin), buf.data());
+	std::string utf8name = mpt::convert<std::string>(mpt::common_encoding::utf8, name);
+	buf.resize(buf.size() + utf8name.length());
+	std::transform(utf8name.begin(), utf8name.end(), buf.data() + sizeof(mpt::UUIDbin), [](char c) { return mpt::byte_cast<std::byte>(c); });
+	std::array<std::byte, 16> hash = mpt::crypto::hash::MD5().process(mpt::as_span(buf)).result();
+	mpt::UUIDbin uuidbin;
+	std::copy(hash.begin(), hash.begin() + 16, mpt::as_raw_memory(uuidbin).data());
+	mpt::UUID uuid{uuidbin};
+	uuid.MakeRFC4122(3);
+	return uuid;
+}
+
+// Create a RFC4122 Version 5 namespace UUID
+inline mpt::UUID UUIDRFC4122NamespaceV5(const mpt::UUID & ns, const mpt::ustring & name) {
+	mpt::UUIDbin binns = ns;
+	std::vector<std::byte> buf;
+	buf.resize(sizeof(mpt::UUIDbin));
+	std::copy(mpt::as_raw_memory(binns).data(), mpt::as_raw_memory(binns).data() + sizeof(mpt::UUIDbin), buf.data());
+	std::string utf8name = mpt::convert<std::string>(mpt::common_encoding::utf8, name);
+	buf.resize(buf.size() + utf8name.length());
+	std::transform(utf8name.begin(), utf8name.end(), buf.data() + sizeof(mpt::UUIDbin), [](char c) { return mpt::byte_cast<std::byte>(c); });
+	std::array<std::byte, 20> hash = mpt::crypto::hash::SHA1().process(mpt::as_span(buf)).result();
+	UUIDbin uuidbin;
+	std::copy(hash.begin(), hash.begin() + 16, mpt::as_raw_memory(uuidbin).data());
+	mpt::UUID uuid{uuidbin};
+	uuid.MakeRFC4122(5);
+	return uuid;
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP

Property changes on: src/mpt/uuid_namespace/uuid_namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/.clang-format
===================================================================
--- src/mpt/.clang-format	(nonexistent)
+++ src/mpt/.clang-format	(working copy)
@@ -0,0 +1,130 @@
+Language: Cpp
+Standard: c++17
+
+AccessModifierOffset: -4 #?
+AlignAfterOpenBracket: AlwaysBreak
+AlignConsecutiveAssignments: false
+AlignConsecutiveBitFields: false
+AlignConsecutiveDeclarations: false
+AlignConsecutiveMacros: true
+AlignEscapedNewlines: DontAlign
+AlignOperands: DontAlign
+AlignTrailingComments: true
+AllowAllArgumentsOnNextLine: true
+AllowAllConstructorInitializersOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: Never
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortEnumsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: Empty
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLambdasOnASingleLine: Inline
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: true
+AlwaysBreakTemplateDeclarations: Yes
+BinPackArguments: true
+BinPackParameters: false
+BraceWrapping:
+ AfterCaseLabel: false
+ AfterClass: false
+ AfterControlStatement: MultiLine
+ AfterEnum: false
+ AfterFunction: false
+ AfterNamespace: false
+ #AfterObjCDeclaration
+ AfterStruct: false
+ AfterUnion: false
+ AfterExternBlock: false
+ BeforeCatch: false
+ BeforeElse: false
+ BeforeLambdaBody: false
+ BeforeWhile: false
+ IndentBraces: false
+ SplitEmptyFunction: true
+ SplitEmptyRecord: false
+ SplitEmptyNamespace: true
+#BreakAfterJavaFieldAnnotations
+BreakBeforeBinaryOperators: NonAssignment
+BreakBeforeBraces: Custom
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializers: BeforeComma
+BreakInheritanceList: BeforeComma
+BreakStringLiterals: false
+ColumnLimit: 0
+CommentPragmas: '' #?
+CompactNamespaces: false
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+ConstructorInitializerIndentWidth: 4 #?
+ContinuationIndentWidth: 4 #?
+Cpp11BracedListStyle: true
+DeriveLineEnding: true
+DerivePointerAlignment: false
+FixNamespaceComments: true
+ForEachMacros: []
+IncludeBlocks: Preserve
+IncludeCategories: [] #?
+IncludeIsMainRegex: '' #?
+IncludeIsMainSourceRegex: '' #?
+IndentCaseLabels: true
+IndentCaseBlocks: true
+IndentExternBlock: NoIndent
+IndentGotoLabels: false
+IndentPPDirectives: None
+InsertTrailingCommas: None
+#BeforeHash
+IndentWidth: 4
+IndentWrappedFunctionNames: true
+#JavaImportGroups
+#JavaScriptQuotes
+#JavaScriptWrapImports
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: '^MPT_TEST_GROUP_BEGIN$' #?
+MacroBlockEnd: '^MPT_TEST_GROUP_END$' #?
+MaxEmptyLinesToKeep: 5
+NamespaceIndentation: None
+NamespaceMacros: [] #?
+#ObjCBinPackProtocolList
+#ObjCBlockIndentWidth
+#ObjCBreakBeforeNestedBlockParam
+#ObjCSpaceAfterProperty
+#ObjCSpaceBeforeProtocolList
+#PenaltyBreakAssignment
+#PenaltyBreakBeforeFirstCallParameter
+#PenaltyBreakComment
+#PenaltyBreakFirstLessLess
+#PenaltyBreakString
+#PenaltyBreakTemplateDeclaration
+#PenaltyExcessCharacter
+#PenaltyReturnTypeOnItsOwnLine
+PointerAlignment: Middle
+#RawStringFormats
+ReflowComments: false
+SortIncludes: false
+SortUsingDeclarations: true
+SpaceAfterCStyleCast: false
+SpaceAfterLogicalNot: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCpp11BracedList: false
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: ControlStatements
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceBeforeSquareBrackets: false
+SpaceInEmptyBlock: true
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: false
+SpacesInCStyleCastParentheses: false
+SpacesInConditionalStatement: false
+SpacesInContainerLiterals: true
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+StatementMacros: [ '_Pragma', '__pragma', MPT_WARNING ] #?
+TabWidth: 4
+TypenameMacros: [] #?
+UseCRLF: false
+UseTab: ForContinuationAndIndentation
+WhitespaceSensitiveMacros:
+  - MPT_PP_STRINGIFY

Property changes on: src/mpt/.clang-format
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-clang-format
\ No newline at end of property
Index: src/mpt/base/algorithm.hpp
===================================================================
--- src/mpt/base/algorithm.hpp	(nonexistent)
+++ src/mpt/base/algorithm.hpp	(working copy)
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ALGORITHM_HPP
+#define MPT_BASE_ALGORITHM_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/saturate_cast.hpp"
+
+#include <algorithm>
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Grows x with an exponential factor suitable for increasing buffer sizes.
+// Clamps the result at limit.
+// And avoids integer overflows while doing its business.
+// The growth factor is 1.5, rounding down, execpt for the initial x==1 case.
+template <typename T, typename Tlimit>
+inline T exponential_grow(const T & x, const Tlimit & limit) {
+	if (x <= 1) {
+		return 2;
+	}
+	T add = std::min(x >> 1, std::numeric_limits<T>::max() - x);
+	return std::min(x + add, mpt::saturate_cast<T>(limit));
+}
+
+template <typename T>
+inline T exponential_grow(const T & x) {
+	return mpt::exponential_grow(x, std::numeric_limits<T>::max());
+}
+
+
+// Check if val is in [lo,hi] without causing compiler warnings
+// if theses checks are always true due to the domain of T.
+// GCC does not warn if the type is templated.
+template <typename T, typename C>
+constexpr bool is_in_range(const T & val, const C & lo, const C & hi) {
+	return lo <= val && val <= hi;
+}
+
+
+template <typename Tcontainer, typename Tval>
+MPT_CONSTEXPR20_FUN bool contains(const Tcontainer & container, const Tval & value) noexcept(noexcept(std::find(std::begin(container), std::end(container), value))) {
+	return std::find(std::begin(container), std::end(container), value) != std::end(container);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALGORITHM_HPP

Property changes on: src/mpt/base/algorithm.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/alloc.hpp
===================================================================
--- src/mpt/base/alloc.hpp	(nonexistent)
+++ src/mpt/base/alloc.hpp	(working copy)
@@ -0,0 +1,157 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ALLOC_HPP
+#define MPT_BASE_ALLOC_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/span.hpp"
+
+#include <iterator>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T>
+inline mpt::span<T> as_span(std::vector<T> & cont) {
+	return mpt::span<T>(cont.data(), cont.data() + cont.size());
+}
+
+template <typename T>
+inline mpt::span<const T> as_span(const std::vector<T> & cont) {
+	return mpt::span<const T>(cont.data(), cont.data() + cont.size());
+}
+
+template <typename T>
+inline span<T> as_span(std::basic_string<T> & str) {
+	return span<T>(str.data(), str.size());
+}
+
+template <typename T>
+inline span<const T> as_span(const std::basic_string<T> & str) {
+	return span<const T>(str.data(), str.size());
+}
+
+
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T * beg, T * end) {
+	return std::vector<typename std::remove_const<T>::type>(beg, end);
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T * data, std::size_t size) {
+	return std::vector<typename std::remove_const<T>::type>(data, data + size);
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(mpt::span<T> data) {
+	return std::vector<typename std::remove_const<T>::type>(data.data(), data.data() + data.size());
+}
+
+template <typename T, std::size_t N>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T (&arr)[N]) {
+	return std::vector<typename std::remove_const<T>::type>(std::begin(arr), std::end(arr));
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(const std::basic_string<T> & str) {
+	return std::vector<typename std::remove_const<T>::type>(str.begin(), str.end());
+}
+
+
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T * beg, T * end) {
+	return std::basic_string<typename std::remove_const<T>::type>(beg, end);
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T * data, std::size_t size) {
+	return std::basic_string<typename std::remove_const<T>::type>(data, data + size);
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(mpt::span<T> data) {
+	return std::basic_string<typename std::remove_const<T>::type>(data.data(), data.data() + data.size());
+}
+
+template <typename T, std::size_t N>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T (&arr)[N]) {
+	return std::basic_string<typename std::remove_const<T>::type>(std::begin(arr), std::end(arr));
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(const std::vector<T> & str) {
+	return std::vector<typename std::remove_const<T>::type>(str.begin(), str.end());
+}
+
+
+
+template <typename Tcont2, typename Tcont1>
+inline Tcont1 & append(Tcont1 & cont1, const Tcont2 & cont2) {
+	cont1.insert(cont1.end(), cont2.begin(), cont2.end());
+	return cont1;
+}
+
+template <typename Tit2, typename Tcont1>
+inline Tcont1 & append(Tcont1 & cont1, Tit2 beg, Tit2 end) {
+	cont1.insert(cont1.end(), beg, end);
+	return cont1;
+}
+
+
+
+template <typename Tdst, typename Tsrc>
+struct buffer_cast_impl {
+	inline Tdst operator()(const Tsrc & src) const {
+		return Tdst(mpt::byte_cast<const typename Tdst::value_type *>(src.data()), mpt::byte_cast<const typename Tdst::value_type *>(src.data()) + src.size());
+	}
+};
+
+// casts between vector<->string of byte-castable types
+template <typename Tdst, typename Tsrc>
+inline Tdst buffer_cast(Tsrc src) {
+	return buffer_cast_impl<Tdst, Tsrc>()(src);
+}
+
+
+
+template <typename T>
+struct as_raw_memory_impl<std::vector<T>> {
+	inline mpt::const_byte_span operator()(const std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+	inline mpt::byte_span operator()(std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+};
+
+template <typename T>
+struct as_raw_memory_impl<const std::vector<T>> {
+	inline mpt::const_byte_span operator()(const std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALLOC_HPP

Property changes on: src/mpt/base/alloc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/arithmetic_shift.hpp
===================================================================
--- src/mpt/base/arithmetic_shift.hpp	(nonexistent)
+++ src/mpt/base/arithmetic_shift.hpp	(working copy)
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ARITHMETIC_SHIFT_HPP
+#define MPT_BASE_ARITHMETIC_SHIFT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/saturate_cast.hpp"
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// mpt::rshift_signed
+// mpt::lshift_signed
+// Shift a signed integer value in a well-defined manner.
+// Does the same thing as MSVC would do. This is verified by the test suite.
+
+template <typename T>
+constexpr auto rshift_signed_standard(T x, int y) noexcept -> decltype(x >> y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	using result_type = decltype(x >> y);
+	using unsigned_result_type = typename std::make_unsigned<result_type>::type;
+	const unsigned_result_type roffset = static_cast<unsigned_result_type>(1) << ((sizeof(result_type) * 8) - 1);
+	result_type rx = x;
+	unsigned_result_type urx = static_cast<unsigned_result_type>(rx);
+	urx += roffset;
+	urx >>= y;
+	urx -= roffset >> y;
+	return static_cast<result_type>(urx);
+}
+
+template <typename T>
+constexpr auto lshift_signed_standard(T x, int y) noexcept -> decltype(x << y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	using result_type = decltype(x << y);
+	using unsigned_result_type = typename std::make_unsigned<result_type>::type;
+	const unsigned_result_type roffset = static_cast<unsigned_result_type>(1) << ((sizeof(result_type) * 8) - 1);
+	result_type rx = x;
+	unsigned_result_type urx = static_cast<unsigned_result_type>(rx);
+	urx += roffset;
+	urx <<= y;
+	urx -= roffset << y;
+	return static_cast<result_type>(urx);
+}
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+template <typename T>
+constexpr auto rshift_signed_undefined(T x, int y) noexcept -> decltype(x >> y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	return x >> y;
+}
+
+template <typename T>
+constexpr auto lshift_signed_undefined(T x, int y) noexcept -> decltype(x << y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	return x << y;
+}
+
+template <typename T>
+constexpr auto rshift_signed(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed_undefined(x, y);
+}
+
+template <typename T>
+constexpr auto lshift_signed(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed_undefined(x, y);
+}
+
+#else
+
+template <typename T>
+constexpr auto rshift_signed(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed_standard(x, y);
+}
+
+template <typename T>
+constexpr auto lshift_signed(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed_standard(x, y);
+}
+
+#endif
+
+template <typename T>
+constexpr auto arithmetic_shift_right(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto arithmetic_shift_right(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto sar(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto sal(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed(x, y);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ARITHMETIC_SHIFT_HPP

Property changes on: src/mpt/base/arithmetic_shift.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/array.hpp
===================================================================
--- src/mpt/base/array.hpp	(nonexistent)
+++ src/mpt/base/array.hpp	(working copy)
@@ -0,0 +1,82 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ARRAY_HPP
+#define MPT_BASE_ARRAY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename T>
+struct stdarray_extent : std::integral_constant<std::size_t, 0> { };
+
+template <typename T, std::size_t N>
+struct stdarray_extent<std::array<T, N>> : std::integral_constant<std::size_t, N> { };
+
+template <typename T>
+struct is_stdarray : std::false_type { };
+
+template <typename T, std::size_t N>
+struct is_stdarray<std::array<T, N>> : std::true_type { };
+
+// mpt::extent is the same as std::extent,
+// but also works for std::array,
+// and asserts that the given type is actually an array type instead of returning 0.
+// use as:
+// mpt::extent<decltype(expr)>()
+// mpt::extent<decltype(variable)>()
+// mpt::extent<decltype(type)>()
+// mpt::extent<type>()
+template <typename T>
+constexpr std::size_t extent() noexcept {
+	using Tarray = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
+	static_assert(std::is_array<Tarray>::value || mpt::is_stdarray<Tarray>::value);
+	if constexpr (mpt::is_stdarray<Tarray>::value) {
+		return mpt::stdarray_extent<Tarray>();
+	} else {
+		return std::extent<Tarray>();
+	}
+}
+
+template <typename>
+struct array_size;
+
+template <typename T, std::size_t N>
+struct array_size<std::array<T, N>> {
+	static constexpr std::size_t size = N;
+};
+
+template <typename T, std::size_t N>
+struct array_size<T[N]> {
+	static constexpr std::size_t size = N;
+};
+
+
+template <typename T, std::size_t N, typename Tx>
+constexpr std::array<T, N> init_array(const Tx & x) {
+	std::array<T, N> result{};
+	for (std::size_t i = 0; i < N; ++i) {
+		result[i] = x;
+	}
+	return result;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ARRAY_HPP

Property changes on: src/mpt/base/array.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/bit.hpp
===================================================================
--- src/mpt/base/bit.hpp	(nonexistent)
+++ src/mpt/base/bit.hpp	(working copy)
@@ -0,0 +1,392 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_BIT_HPP
+#define MPT_BASE_BIT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/macros.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <bit>
+#else // !C++20
+#include <array>
+#include <limits>
+#endif // C++20
+#include <type_traits>
+
+#include <cstddef>
+#if MPT_CXX_BEFORE(20)
+#include <cstring>
+#endif // !C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+using std::bit_cast;
+#else
+// C++2a compatible bit_cast.
+// Not implementing constexpr because this is not easily possible pre C++20.
+template <typename Tdst, typename Tsrc>
+MPT_FORCEINLINE typename std::enable_if<(sizeof(Tdst) == sizeof(Tsrc)) && std::is_trivially_copyable<Tsrc>::value && std::is_trivially_copyable<Tdst>::value, Tdst>::type bit_cast(const Tsrc & src) noexcept {
+	Tdst dst{};
+	std::memcpy(&dst, &src, sizeof(Tdst));
+	return dst;
+}
+#endif
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::endian;
+
+static_assert(mpt::endian::big != mpt::endian::little, "platform with all scalar types having size 1 is not supported");
+
+constexpr mpt::endian get_endian() noexcept {
+	return mpt::endian::native;
+}
+
+constexpr bool endian_is_little() noexcept {
+	return get_endian() == mpt::endian::little;
+}
+
+constexpr bool endian_is_big() noexcept {
+	return get_endian() == mpt::endian::big;
+}
+
+constexpr bool endian_is_weird() noexcept {
+	return !endian_is_little() && !endian_is_big();
+}
+
+#else // !C++20
+
+#if !MPT_COMPILER_GENERIC
+
+#if MPT_COMPILER_MSVC
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#endif
+#endif
+
+// fallback:
+#if !defined(MPT_PLATFORM_BIG_ENDIAN) && !defined(MPT_PLATFORM_LITTLE_ENDIAN)
+// taken from boost/detail/endian.hpp
+#if (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) \
+	|| (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) \
+	|| (defined(_STLP_BIG_ENDIAN) && !defined(_STLP_LITTLE_ENDIAN))
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) \
+	|| (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) \
+	|| (defined(_STLP_LITTLE_ENDIAN) && !defined(_STLP_BIG_ENDIAN))
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#elif defined(__sparc) || defined(__sparc__) \
+	|| defined(_POWER) || defined(__powerpc__) \
+	|| defined(__ppc__) || defined(__hpux) || defined(__hppa) \
+	|| defined(_MIPSEB) || defined(_POWER) \
+	|| defined(__s390__)
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif defined(__i386__) || defined(__alpha__) \
+	|| defined(__ia64) || defined(__ia64__) \
+	|| defined(_M_IX86) || defined(_M_IA64) \
+	|| defined(_M_ALPHA) || defined(__amd64) \
+	|| defined(__amd64__) || defined(_M_AMD64) \
+	|| defined(__x86_64) || defined(__x86_64__) \
+	|| defined(_M_X64) || defined(__bfin__)
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#endif
+#endif
+
+#endif // !MPT_COMPILER_GENERIC
+
+enum class endian
+{
+	little = 0x78563412u,
+	big = 0x12345678u,
+	weird = 1u,
+#if MPT_COMPILER_GENERIC
+	native = 0u,
+#elif defined(MPT_PLATFORM_LITTLE_ENDIAN)
+	native = little,
+#elif defined(MPT_PLATFORM_BIG_ENDIAN)
+	native = big,
+#else
+	native = 0u,
+#endif
+};
+
+static_assert(mpt::endian::big != mpt::endian::little, "platform with all scalar types having size 1 is not supported");
+
+MPT_FORCEINLINE mpt::endian endian_probe() noexcept {
+	using endian_probe_type = uint32;
+	static_assert(sizeof(endian_probe_type) == 4);
+	constexpr endian_probe_type endian_probe_big = 0x12345678u;
+	constexpr endian_probe_type endian_probe_little = 0x78563412u;
+	const std::array<std::byte, sizeof(endian_probe_type)> probe{{std::byte{0x12}, std::byte{0x34}, std::byte{0x56}, std::byte{0x78}}};
+	const endian_probe_type test = mpt::bit_cast<endian_probe_type>(probe);
+	mpt::endian result = mpt::endian::native;
+	switch (test) {
+		case endian_probe_big:
+			result = mpt::endian::big;
+			break;
+		case endian_probe_little:
+			result = mpt::endian::little;
+			break;
+		default:
+			result = mpt::endian::weird;
+			break;
+	}
+	return result;
+}
+
+MPT_FORCEINLINE mpt::endian get_endian() noexcept {
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 6285) // false-positive: (<non-zero constant> || <non-zero constant>) is always a non-zero constant.
+#endif                          // MPT_COMPILER_MSVC
+	if constexpr ((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+		return mpt::endian::native;
+	} else {
+		return mpt::endian_probe();
+	}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+}
+
+MPT_FORCEINLINE bool endian_is_little() noexcept {
+	return get_endian() == mpt::endian::little;
+}
+
+MPT_FORCEINLINE bool endian_is_big() noexcept {
+	return get_endian() == mpt::endian::big;
+}
+
+MPT_FORCEINLINE bool endian_is_weird() noexcept {
+	return !endian_is_little() && !endian_is_big();
+}
+
+#endif // C++20
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::bit_ceil;
+using std::bit_floor;
+using std::bit_width;
+using std::countl_one;
+using std::countl_zero;
+using std::countr_one;
+using std::countr_zero;
+using std::has_single_bit;
+using std::popcount;
+using std::rotl;
+using std::rotr;
+
+#else // !C++20
+
+// C++20 <bit> header.
+// Note that we do not use SFINAE here but instead rely on static_assert.
+
+template <typename T>
+constexpr int popcount(T val) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int result = 0;
+	while (val > 0) {
+		if (val & 0x1) {
+			result++;
+		}
+		val >>= 1;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr bool has_single_bit(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	return mpt::popcount(x) == 1;
+}
+
+template <typename T>
+constexpr T bit_ceil(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	T result = 1;
+	while (result < x) {
+		T newresult = result << 1;
+		if (newresult < result) {
+			return 0;
+		}
+		result = newresult;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr T bit_floor(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	if (x == 0) {
+		return 0;
+	}
+	T result = 1;
+	do {
+		T newresult = result << 1;
+		if (newresult < result) {
+			return result;
+		}
+		result = newresult;
+	} while (result <= x);
+	return result >> 1;
+}
+
+template <typename T>
+constexpr T bit_width(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	T result = 0;
+	while (x > 0) {
+		x >>= 1;
+		result += 1;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr int countl_zero(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = std::numeric_limits<T>::digits - 1; bit >= 0; --bit) {
+		if ((x & (1u << bit)) == 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countl_one(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = std::numeric_limits<T>::digits - 1; bit >= 0; --bit) {
+		if ((x & (1u << bit)) != 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countr_zero(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = 0; bit < std::numeric_limits<T>::digits; ++bit) {
+		if ((x & (1u << bit)) == 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countr_one(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = 0; bit < std::numeric_limits<T>::digits; ++bit) {
+		if ((x & (1u << bit)) != 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr T rotl_impl(T x, int r) noexcept {
+	auto N = std::numeric_limits<T>::digits;
+	return (x >> (N - r)) | (x << r);
+}
+
+template <typename T>
+constexpr T rotr_impl(T x, int r) noexcept {
+	auto N = std::numeric_limits<T>::digits;
+	return (x << (N - r)) | (x >> r);
+}
+
+template <typename T>
+constexpr T rotl(T x, int s) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	auto N = std::numeric_limits<T>::digits;
+	auto r = s % N;
+	return (s < 0) ? mpt::rotr_impl(x, -s) : ((x >> (N - r)) | (x << r));
+}
+
+template <typename T>
+constexpr T rotr(T x, int s) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	auto N = std::numeric_limits<T>::digits;
+	auto r = s % N;
+	return (s < 0) ? mpt::rotl_impl(x, -s) : ((x << (N - r)) | (x >> r));
+}
+
+#endif // C++20
+
+
+
+template <typename T>
+constexpr int lower_bound_entropy_bits(T x_) {
+	typename std::make_unsigned<T>::type x = static_cast<typename std::make_unsigned<T>::type>(x_);
+	return mpt::bit_width(x) == static_cast<typename std::make_unsigned<T>::type>(mpt::popcount(x)) ? mpt::bit_width(x) : mpt::bit_width(x) - 1;
+}
+
+
+template <typename T>
+constexpr bool is_mask(T x) {
+	static_assert(std::is_integral<T>::value);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	unsigned_T ux = static_cast<unsigned_T>(x);
+	unsigned_T mask = 0;
+	for (std::size_t bits = 0; bits <= (sizeof(unsigned_T) * 8); ++bits) {
+		mask = (mask << 1) | 1u;
+		if (ux == mask) {
+			return true;
+		}
+	}
+	return false;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_BIT_HPP

Property changes on: src/mpt/base/bit.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/check_platform.hpp
===================================================================
--- src/mpt/base/check_platform.hpp	(nonexistent)
+++ src/mpt/base/check_platform.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_CHECK_PLATFORM_HPP
+#define MPT_BASE_CHECK_PLATFORM_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/pointer.hpp"
+
+#include <limits>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+static_assert(sizeof(std::uintptr_t) == sizeof(void *));
+static_assert(std::numeric_limits<unsigned char>::digits == 8);
+
+static_assert(sizeof(char) == 1);
+
+static_assert(sizeof(std::byte) == 1);
+static_assert(alignof(std::byte) == 1);
+
+static_assert(mpt::arch_bits == static_cast<int>(mpt::pointer_size) * 8);
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_CHECK_PLATFORM_HPP

Property changes on: src/mpt/base/check_platform.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/compiletime_warning.hpp
===================================================================
--- src/mpt/base/compiletime_warning.hpp	(nonexistent)
+++ src/mpt/base/compiletime_warning.hpp	(working copy)
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_COMPILETIME_WARNING_HPP
+#define MPT_BASE_COMPILETIME_WARNING_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/preprocessor.hpp"
+
+
+
+#if MPT_COMPILER_MSVC
+
+#define MPT_WARNING(text)           __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
+#define MPT_WARNING_STATEMENT(text) __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
+
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+
+#define MPT_WARNING(text)           _Pragma(MPT_PP_STRINGIFY(GCC warning text))
+#define MPT_WARNING_STATEMENT(text) _Pragma(MPT_PP_STRINGIFY(GCC warning text))
+
+#else
+
+// portable #pragma message or #warning replacement
+#define MPT_WARNING(text) \
+	static inline int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME)() noexcept { \
+		int warning [[deprecated("Warning: " text)]] = 0; \
+		return warning; \
+	} \
+/**/
+#define MPT_WARNING_STATEMENT(text) \
+	int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME) = []() { \
+		int warning [[deprecated("Warning: " text)]] = 0; \
+		return warning; \
+	}() /**/
+
+#endif
+
+
+
+#endif // MPT_BASE_COMPILETIME_WARNING_HPP

Property changes on: src/mpt/base/compiletime_warning.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/constexpr_throw.hpp
===================================================================
--- src/mpt/base/constexpr_throw.hpp	(nonexistent)
+++ src/mpt/base/constexpr_throw.hpp	(working copy)
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_CONSTEXPR_THROW_HPP
+#define MPT_BASE_CONSTEXPR_THROW_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Work-around for the requirement of at least 1 non-throwing function argument combination in C++ (17,2a).
+
+template <typename Exception>
+constexpr bool constexpr_throw_helper(Exception && e, bool really = true) {
+	//return !really ? really : throw std::forward<Exception>(e);
+	if (really) {
+		throw std::forward<Exception>(e);
+	}
+	// cppcheck-suppress identicalConditionAfterEarlyExit
+	return really;
+}
+
+template <typename Exception>
+constexpr bool constexpr_throw(Exception && e) {
+	return mpt::constexpr_throw_helper(std::forward<Exception>(e));
+}
+
+template <typename T, typename Exception>
+constexpr T constexpr_throw_helper(Exception && e, bool really = true) {
+	//return !really ? really : throw std::forward<Exception>(e);
+	if (really) {
+		throw std::forward<Exception>(e);
+	}
+	return T{};
+}
+
+template <typename T, typename Exception>
+constexpr T constexpr_throw(Exception && e) {
+	return mpt::constexpr_throw_helper<T>(std::forward<Exception>(e));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_CONSTEXPR_THROW_HPP

Property changes on: src/mpt/base/constexpr_throw.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect.hpp
===================================================================
--- src/mpt/base/detect.hpp	(nonexistent)
+++ src/mpt/base/detect.hpp	(working copy)
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_HPP
+#define MPT_BASE_DETECT_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+#include "mpt/base/detect_libcxx.hpp"
+#include "mpt/base/detect_libc.hpp"
+
+
+
+#endif // MPT_BASE_DETECT_HPP

Property changes on: src/mpt/base/detect.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_compiler.hpp
===================================================================
--- src/mpt/base/detect_compiler.hpp	(nonexistent)
+++ src/mpt/base/detect_compiler.hpp	(working copy)
@@ -0,0 +1,170 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_COMPILER_HPP
+#define MPT_BASE_DETECT_COMPILER_HPP
+
+
+
+#define MPT_COMPILER_MAKE_VERSION2(version, sp)         ((version)*100 + (sp))
+#define MPT_COMPILER_MAKE_VERSION3(major, minor, patch) ((major)*10000 + (minor)*100 + (patch))
+
+
+
+#if defined(MPT_COMPILER_GENERIC)
+
+#undef MPT_COMPILER_GENERIC
+#define MPT_COMPILER_GENERIC 1
+
+#elif defined(__clang__) && defined(_MSC_VER) && defined(__c2__)
+
+#error "Clang/C2 is not supported. Please use Clang/LLVM for Windows instead."
+
+#elif defined(__clang__)
+
+#define MPT_COMPILER_CLANG                      1
+#define MPT_COMPILER_CLANG_VERSION              MPT_COMPILER_MAKE_VERSION3(__clang_major__, __clang_minor__, __clang_patchlevel__)
+#define MPT_CLANG_AT_LEAST(major, minor, patch) (MPT_COMPILER_CLANG_VERSION >= MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+#define MPT_CLANG_BEFORE(major, minor, patch)   (MPT_COMPILER_CLANG_VERSION < MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+
+#if MPT_CLANG_BEFORE(7, 0, 0)
+#error "clang version 7 required"
+#endif
+
+#if defined(__clang_analyzer__)
+#ifndef MPT_BUILD_ANALYZED
+#define MPT_BUILD_ANALYZED
+#endif
+#endif
+
+#elif defined(__GNUC__)
+
+#define MPT_COMPILER_GCC                      1
+#define MPT_COMPILER_GCC_VERSION              MPT_COMPILER_MAKE_VERSION3(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+#define MPT_GCC_AT_LEAST(major, minor, patch) (MPT_COMPILER_GCC_VERSION >= MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+#define MPT_GCC_BEFORE(major, minor, patch)   (MPT_COMPILER_GCC_VERSION < MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+
+#if MPT_GCC_BEFORE(8, 1, 0)
+#error "GCC version 8.1 required"
+#endif
+
+#elif defined(_MSC_VER)
+
+#define MPT_COMPILER_MSVC 1
+#if (_MSC_VER >= 1926)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 6)
+#elif (_MSC_VER >= 1925)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 5)
+#elif (_MSC_VER >= 1924)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 4)
+#elif (_MSC_VER >= 1923)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 3)
+#elif (_MSC_VER >= 1922)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 2)
+#elif (_MSC_VER >= 1921)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 1)
+#elif (_MSC_VER >= 1920)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 0)
+#elif (_MSC_VER >= 1916)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 9)
+#elif (_MSC_VER >= 1915)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 8)
+#elif (_MSC_VER >= 1914)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 7)
+#elif (_MSC_VER >= 1913)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 6)
+#elif (_MSC_VER >= 1912)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 5)
+#elif (_MSC_VER >= 1911)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 3)
+#elif (_MSC_VER >= 1910)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 0)
+#elif (_MSC_VER >= 1900) && defined(_MSVC_LANG)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2015, 3)
+#elif (_MSC_VER >= 1900)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2015, 0)
+#elif (_MSC_VER >= 1800)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2013, 0)
+#elif (_MSC_VER >= 1700)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2012, 0)
+#elif (_MSC_VER >= 1600)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2010, 0)
+#elif (_MSC_VER >= 1500)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2008, 0)
+#else
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2005, 0)
+#endif
+#define MPT_MSVC_AT_LEAST(version, sp) (MPT_COMPILER_MSVC_VERSION >= MPT_COMPILER_MAKE_VERSION2((version), (sp)))
+#define MPT_MSVC_BEFORE(version, sp)   (MPT_COMPILER_MSVC_VERSION < MPT_COMPILER_MAKE_VERSION2((version), (sp)))
+
+#if MPT_MSVC_BEFORE(2017, 9)
+#error "MSVC version 2017 15.9 required"
+#endif
+
+#if defined(_PREFAST_)
+#ifndef MPT_BUILD_ANALYZED
+#define MPT_BUILD_ANALYZED
+#endif
+#endif
+
+#else
+
+#define MPT_COMPILER_GENERIC 1
+
+#endif
+
+
+
+#ifndef MPT_COMPILER_GENERIC
+#define MPT_COMPILER_GENERIC 0
+#endif
+#ifndef MPT_COMPILER_CLANG
+#define MPT_COMPILER_CLANG                      0
+#define MPT_CLANG_AT_LEAST(major, minor, patch) 0
+#define MPT_CLANG_BEFORE(major, minor, patch)   0
+#endif
+#ifndef MPT_COMPILER_GCC
+#define MPT_COMPILER_GCC                      0
+#define MPT_GCC_AT_LEAST(major, minor, patch) 0
+#define MPT_GCC_BEFORE(major, minor, patch)   0
+#endif
+#ifndef MPT_COMPILER_MSVC
+#define MPT_COMPILER_MSVC              0
+#define MPT_MSVC_AT_LEAST(version, sp) 0
+#define MPT_MSVC_BEFORE(version, sp)   0
+#endif
+
+
+
+#if MPT_COMPILER_GENERIC || MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+
+#if (__cplusplus >= 201703)
+#define MPT_CXX 17
+#else
+#define MPT_CXX 17
+#endif
+
+#elif MPT_COMPILER_MSVC
+
+#if (_MSVC_LANG >= 201703)
+#define MPT_CXX 17
+#else
+#define MPT_CXX 17
+#endif
+
+#else
+
+#define MPT_CXX 17
+
+#endif
+
+// MPT_CXX is stricter than just using __cplusplus directly.
+// We will only claim a language version as supported IFF all core language and
+// library fatures that we need are actually supported AND working correctly
+// (to our needs).
+
+#define MPT_CXX_AT_LEAST(version) (MPT_CXX >= (version))
+#define MPT_CXX_BEFORE(version)   (MPT_CXX < (version))
+
+
+
+#endif // MPT_BASE_DETECT_COMPILER_HPP

Property changes on: src/mpt/base/detect_compiler.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_libc.hpp
===================================================================
--- src/mpt/base/detect_libc.hpp	(nonexistent)
+++ src/mpt/base/detect_libc.hpp	(working copy)
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_LIBC_HPP
+#define MPT_BASE_DETECT_LIBC_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+
+#include <cstddef>
+
+
+
+// order of checks is important!
+#if MPT_COMPILER_GENERIC
+#define MPT_LIBC_GENERIC 1
+#elif MPT_COMPILER_GCC && (defined(__MINGW32__) || defined(__MINGW64__))
+#define MPT_LIBC_MS 1
+#elif defined(__GNU_LIBRARY__)
+#define MPT_LIBC_GLIBC 1
+#elif MPT_COMPILER_MSVC
+#define MPT_LIBC_MS 1
+#elif MPT_COMPILER_CLANG && MPT_OS_WINDOWS
+#define MPT_LIBC_MS 1
+#else
+#define MPT_LIBC_GENERIC 1
+#endif
+
+#ifndef MPT_LIBC_GENERIC
+#define MPT_LIBC_GENERIC 0
+#endif
+#ifndef MPT_LIBC_GLIBC
+#define MPT_LIBC_GLIBC 0
+#endif
+#ifndef MPT_LIBC_MS
+#define MPT_LIBC_MS 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_LIBC_HPP

Property changes on: src/mpt/base/detect_libc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_libcxx.hpp
===================================================================
--- src/mpt/base/detect_libcxx.hpp	(nonexistent)
+++ src/mpt/base/detect_libcxx.hpp	(working copy)
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_LIBCXX_HPP
+#define MPT_BASE_DETECT_LIBCXX_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <version>
+#else // !C++20
+#include <array>
+#endif // C++20
+
+
+
+// order of checks is important!
+#if MPT_COMPILER_GENERIC
+#define MPT_LIBCXX_GENERIC 1
+#elif defined(_LIBCPP_VERSION)
+#define MPT_LIBCXX_LLVM 1
+#elif defined(__GLIBCXX__) || defined(__GLIBCPP__)
+#define MPT_LIBCXX_GNU 1
+#elif MPT_COMPILER_MSVC
+#define MPT_LIBCXX_MS 1
+#elif MPT_COMPILER_CLANG && MPT_OS_WINDOWS
+#define MPT_LIBCXX_MS 1
+#else
+#define MPT_LIBCXX_GENERIC 1
+#endif
+
+#ifndef MPT_LIBCXX_GENERIC
+#define MPT_LIBCXX_GENERIC 0
+#endif
+#ifndef MPT_LIBCXX_LLVM
+#define MPT_LIBCXX_LLVM 0
+#endif
+#ifndef MPT_LIBCXX_GNU
+#define MPT_LIBCXX_GNU 0
+#endif
+#ifndef MPT_LIBCXX_MS
+#define MPT_LIBCXX_MS 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_LIBCXX_HPP

Property changes on: src/mpt/base/detect_libcxx.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_os.hpp
===================================================================
--- src/mpt/base/detect_os.hpp	(nonexistent)
+++ src/mpt/base/detect_os.hpp	(working copy)
@@ -0,0 +1,109 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_OS_HPP
+#define MPT_BASE_DETECT_OS_HPP
+
+
+
+// The order of the checks matters!
+#if defined(__DJGPP__)
+#define MPT_OS_DJGPP 1
+#elif defined(__EMSCRIPTEN__)
+#define MPT_OS_EMSCRIPTEN 1
+#if defined(__EMSCRIPTEN_major__) && defined(__EMSCRIPTEN_minor__)
+#if (__EMSCRIPTEN_major__ > 1)
+// ok
+#elif (__EMSCRIPTEN_major__ == 1) && (__EMSCRIPTEN_minor__ > 39)
+// ok
+#elif (__EMSCRIPTEN_major__ == 1) && (__EMSCRIPTEN_minor__ == 39) && (__EMSCRIPTEN_tiny__ >= 7)
+// ok
+#else
+#error "Emscripten >= 1.39.7 is required."
+#endif
+#endif
+#elif defined(_WIN32)
+#define MPT_OS_WINDOWS 1
+#if defined(WINAPI_FAMILY)
+#include <winapifamily.h>
+#if (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
+#define MPT_OS_WINDOWS_WINRT 0
+#else
+#define MPT_OS_WINDOWS_WINRT 1
+#endif
+#else // !WINAPI_FAMILY
+#define MPT_OS_WINDOWS_WINRT 0
+#endif // WINAPI_FAMILY
+#elif defined(__APPLE__)
+#define MPT_OS_MACOSX_OR_IOS 1
+//#include "TargetConditionals.h"
+//#if TARGET_IPHONE_SIMULATOR
+//#elif TARGET_OS_IPHONE
+//#elif TARGET_OS_MAC
+//#else
+//#endif
+#elif defined(__HAIKU__)
+#define MPT_OS_HAIKU 1
+#elif defined(__ANDROID__) || defined(ANDROID)
+#define MPT_OS_ANDROID 1
+#elif defined(__linux__)
+#define MPT_OS_LINUX 1
+#elif defined(__DragonFly__)
+#define MPT_OS_DRAGONFLYBSD 1
+#elif defined(__FreeBSD__)
+#define MPT_OS_FREEBSD 1
+#elif defined(__OpenBSD__)
+#define MPT_OS_OPENBSD 1
+#elif defined(__NetBSD__)
+#define MPT_OS_NETBSD 1
+#elif defined(__unix__)
+#define MPT_OS_GENERIC_UNIX 1
+#else
+#define MPT_OS_UNKNOWN 1
+#endif
+
+#ifndef MPT_OS_DJGPP
+#define MPT_OS_DJGPP 0
+#endif
+#ifndef MPT_OS_EMSCRIPTEN
+#define MPT_OS_EMSCRIPTEN 0
+#endif
+#ifndef MPT_OS_WINDOWS
+#define MPT_OS_WINDOWS 0
+#endif
+#ifndef MPT_OS_WINDOWS_WINRT
+#define MPT_OS_WINDOWS_WINRT 0
+#endif
+#ifndef MPT_OS_MACOSX_OR_IOS
+#define MPT_OS_MACOSX_OR_IOS 0
+#endif
+#ifndef MPT_OS_HAIKU
+#define MPT_OS_HAIKU 0
+#endif
+#ifndef MPT_OS_ANDROID
+#define MPT_OS_ANDROID 0
+#endif
+#ifndef MPT_OS_LINUX
+#define MPT_OS_LINUX 0
+#endif
+#ifndef MPT_OS_DRAGONFLYBSD
+#define MPT_OS_DRAGONFLYBSD 0
+#endif
+#ifndef MPT_OS_FREEBSD
+#define MPT_OS_FREEBSD 0
+#endif
+#ifndef MPT_OS_OPENBSD
+#define MPT_OS_OPENBSD 0
+#endif
+#ifndef MPT_OS_NETBSD
+#define MPT_OS_NETBSD 0
+#endif
+#ifndef MPT_OS_GENERIC_UNIX
+#define MPT_OS_GENERIC_UNIX 0
+#endif
+#ifndef MPT_OS_UNKNOWN
+#define MPT_OS_UNKNOWN 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_OS.hpp

Property changes on: src/mpt/base/detect_os.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_quirks.hpp
===================================================================
--- src/mpt/base/detect_quirks.hpp	(nonexistent)
+++ src/mpt/base/detect_quirks.hpp	(working copy)
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_QUIRKS_HPP
+#define MPT_BASE_DETECT_QUIRKS_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+
+
+
+#if MPT_COMPILER_MSVC
+// Compiler has multiplication/division semantics when shifting signed integers.
+#define MPT_COMPILER_SHIFT_SIGNED 1
+#endif
+
+#ifndef MPT_COMPILER_SHIFT_SIGNED
+#define MPT_COMPILER_SHIFT_SIGNED 0
+#endif
+
+
+
+// This should really be based on __STDCPP_THREADS__, but that is not defined by
+// GCC or clang. Stupid.
+// Just assume multithreaded and disable for platforms we know are
+// singlethreaded later on.
+#define MPT_PLATFORM_MULTITHREADED 1
+
+#if MPT_OS_DJGPP
+#undef MPT_PLATFORM_MULTITHREADED
+#define MPT_PLATFORM_MULTITHREADED 0
+#endif
+
+#if (MPT_OS_EMSCRIPTEN && !defined(__EMSCRIPTEN_PTHREADS__))
+#undef MPT_PLATFORM_MULTITHREADED
+#define MPT_PLATFORM_MULTITHREADED 0
+#endif
+
+
+
+#if MPT_OS_EMSCRIPTEN && defined(MPT_BUILD_AUDIOWORKLETPROCESSOR)
+#define MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK
+#endif
+
+
+
+#if MPT_OS_EMSCRIPTEN && defined(MPT_BUILD_AUDIOWORKLETPROCESSOR)
+#define MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+#endif
+
+
+
+#if MPT_OS_DJGPP
+#define MPT_COMPILER_QUIRK_NO_WCHAR
+#endif
+
+
+
+#if defined(__arm__)
+
+#if defined(__SOFTFP__)
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 1
+#else
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+#if defined(__VFP_FP__)
+// native-endian IEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 0
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      0
+#elif defined(__MAVERICK__)
+// little-endian IEEE754, we assume native-endian though
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 1
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      0
+#else
+// not IEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 1
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      1
+#endif
+
+#elif defined(__mips__)
+
+#if defined(__mips_soft_float)
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 1
+#else
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+
+#endif
+
+#if MPT_OS_EMSCRIPTEN
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER64 1
+#endif
+
+#ifndef MPT_COMPILER_QUIRK_FLOAT_PREFER32
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER32 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_PREFER64
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER64 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_EMULATED
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_QUIRKS_HPP

Property changes on: src/mpt/base/detect_quirks.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/floatingpoint.hpp
===================================================================
--- src/mpt/base/floatingpoint.hpp	(nonexistent)
+++ src/mpt/base/floatingpoint.hpp	(working copy)
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_FLOATINGPOINT_HPP
+#define MPT_BASE_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// fp half
+// n/a
+
+// fp single
+using single = float;
+namespace float_literals {
+constexpr single operator"" _fs(long double lit) noexcept {
+	return static_cast<single>(lit);
+}
+} // namespace float_literals
+
+// fp double
+namespace float_literals {
+constexpr double operator"" _fd(long double lit) noexcept {
+	return static_cast<double>(lit);
+}
+} // namespace float_literals
+
+// fp extended
+namespace float_literals {
+constexpr long double operator"" _fe(long double lit) noexcept {
+	return static_cast<long double>(lit);
+}
+} // namespace float_literals
+
+// fp quad
+// n/a
+
+using float32 = std::conditional<sizeof(float) == 4, float, std::conditional<sizeof(double) == 4, double, std::conditional<sizeof(long double) == 4, long double, float>::type>::type>::type;
+namespace float_literals {
+constexpr float32 operator"" _f32(long double lit) noexcept {
+	return static_cast<float32>(lit);
+}
+} // namespace float_literals
+
+using float64 = std::conditional<sizeof(float) == 8, float, std::conditional<sizeof(double) == 8, double, std::conditional<sizeof(long double) == 8, long double, double>::type>::type>::type;
+namespace float_literals {
+constexpr float64 operator"" _f64(long double lit) noexcept {
+	return static_cast<float64>(lit);
+}
+} // namespace float_literals
+
+template <typename T>
+struct float_traits {
+	static constexpr bool is_float = !std::numeric_limits<T>::is_integer;
+	static constexpr bool is_hard = is_float && !MPT_COMPILER_QUIRK_FLOAT_EMULATED;
+	static constexpr bool is_soft = is_float && MPT_COMPILER_QUIRK_FLOAT_EMULATED;
+	static constexpr bool is_float32 = is_float && (sizeof(T) == 4);
+	static constexpr bool is_float64 = is_float && (sizeof(T) == 8);
+	static constexpr bool is_native_endian = is_float && !MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN;
+	static constexpr bool is_ieee754_binary = is_float && std::numeric_limits<T>::is_iec559 && !MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754;
+	static constexpr bool is_ieee754_binary32 = is_float && is_ieee754_binary && is_float32;
+	static constexpr bool is_ieee754_binary64 = is_float && is_ieee754_binary && is_float64;
+	static constexpr bool is_ieee754_binary32ne = is_float && is_ieee754_binary && is_float32 && is_native_endian;
+	static constexpr bool is_ieee754_binary64ne = is_float && is_ieee754_binary && is_float64 && is_native_endian;
+	static constexpr bool is_preferred = is_float && ((is_float32 && MPT_COMPILER_QUIRK_FLOAT_PREFER32) || (is_float64 && MPT_COMPILER_QUIRK_FLOAT_PREFER64));
+};
+
+// prefer smaller floats, but try to use IEEE754 floats
+using nativefloat =
+	std::conditional<mpt::float_traits<float32>::is_preferred, float32, std::conditional<mpt::float_traits<float64>::is_preferred, float64, std::conditional<std::numeric_limits<float>::is_iec559, float, std::conditional<std::numeric_limits<double>::is_iec559, double, std::conditional<std::numeric_limits<long double>::is_iec559, long double, float>::type>::type>::type>::type>::type;
+namespace float_literals {
+constexpr nativefloat operator"" _nf(long double lit) noexcept {
+	return static_cast<nativefloat>(lit);
+}
+} // namespace float_literals
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_FLOATINGPOINT_HPP

Property changes on: src/mpt/base/floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/integer.hpp
===================================================================
--- src/mpt/base/integer.hpp	(nonexistent)
+++ src/mpt/base/integer.hpp	(working copy)
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_INTEGER_HPP
+#define MPT_BASE_INTEGER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <cstdint>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+using int8 = std::int8_t;
+using int16 = std::int16_t;
+using int32 = std::int32_t;
+using int64 = std::int64_t;
+using uint8 = std::uint8_t;
+using uint16 = std::uint16_t;
+using uint32 = std::uint32_t;
+using uint64 = std::uint64_t;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_INTEGER_HPP

Property changes on: src/mpt/base/integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/macros.hpp
===================================================================
--- src/mpt/base/macros.hpp	(nonexistent)
+++ src/mpt/base/macros.hpp	(working copy)
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_MACROS_HPP
+#define MPT_BASE_MACROS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+
+#include <type_traits>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+// Advanced inline attributes
+#if MPT_COMPILER_MSVC
+#define MPT_FORCEINLINE __forceinline
+#define MPT_NOINLINE    __declspec(noinline)
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#define MPT_FORCEINLINE __attribute__((always_inline)) inline
+#define MPT_NOINLINE    __attribute__((noinline))
+#else
+#define MPT_FORCEINLINE inline
+#define MPT_NOINLINE
+#endif
+
+
+
+// constexpr
+#define MPT_CONSTEXPRINLINE constexpr MPT_FORCEINLINE
+#if MPT_CXX_AT_LEAST(20)
+#define MPT_CONSTEXPR20_FUN constexpr MPT_FORCEINLINE
+#define MPT_CONSTEXPR20_VAR constexpr
+#else // !C++20
+#define MPT_CONSTEXPR20_FUN MPT_FORCEINLINE
+#define MPT_CONSTEXPR20_VAR const
+#endif // C++20
+
+
+
+#define MPT_FORCE_CONSTEXPR(expr) [&]() { \
+	constexpr auto x = (expr); \
+	return x; \
+}()
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+#define MPT_IS_CONSTANT_EVALUATED20() std::is_constant_evaluated()
+#define MPT_IS_CONSTANT_EVALUATED()   std::is_constant_evaluated()
+#else // !C++20
+#define MPT_IS_CONSTANT_EVALUATED20() false
+// this pessimizes the case for C++17 by always assuming constexpr context, which implies always running constexpr-friendly code
+#define MPT_IS_CONSTANT_EVALUATED()   true
+#endif // C++20
+
+
+
+#if MPT_COMPILER_MSVC
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	__pragma(warning(push)) \
+	__pragma(warning(disable : 4127)) \
+	if (x) \
+		__pragma(warning(pop)) \
+/**/
+#endif
+
+#if MPT_COMPILER_GCC
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	_Pragma("GCC diagnostic push") \
+	_Pragma("GCC diagnostic ignored \"-Wtype-limits\"") \
+	if (x) \
+		_Pragma("GCC diagnostic pop") \
+/**/
+#endif
+
+#if MPT_COMPILER_CLANG
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	_Pragma("clang diagnostic push") \
+	_Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") \
+	_Pragma("clang diagnostic ignored \"-Wtype-limits\"") \
+	_Pragma("clang diagnostic ignored \"-Wtautological-constant-out-of-range-compare\"") \
+	if (x) \
+		_Pragma("clang diagnostic pop") \
+/**/
+#endif
+
+#if !defined(MPT_MAYBE_CONSTANT_IF)
+// MPT_MAYBE_CONSTANT_IF disables compiler warnings for conditions that may in some case be either always false or always true (this may turn out to be useful in ASSERTions in some cases).
+#define MPT_MAYBE_CONSTANT_IF(x) if (x)
+#endif
+
+
+
+#if MPT_OS_WINDOWS
+#define MPT_UNUSED(x) UNREFERENCED_PARAMETER(x)
+#else
+#define MPT_UNUSED(x) static_cast<void>(x)
+#endif
+
+
+
+#define MPT_DISCARD(expr) static_cast<void>(expr)
+
+
+
+// Use MPT_RESTRICT to indicate that a pointer is guaranteed to not be aliased.
+#if MPT_COMPILER_MSVC || MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#define MPT_RESTRICT __restrict
+#else
+#define MPT_RESTRICT
+#endif
+
+
+
+#endif // MPT_BASE_MACROS_HPP

Property changes on: src/mpt/base/macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/math.hpp
===================================================================
--- src/mpt/base/math.hpp	(nonexistent)
+++ src/mpt/base/math.hpp	(working copy)
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_EMPTY_HPP
+#define MPT_BASE_EMPTY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <cmath>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_OS_DJGPP
+
+inline double round(const long double val) {
+	return ::roundl(val);
+}
+
+inline double round(const double val) {
+	return ::round(val);
+}
+
+inline float round(const float val) {
+	return ::roundf(val);
+}
+
+#else // !MPT_OS_DJGPP
+
+// C++11 std::round
+using std::round;
+
+#endif // MPT_OS_DJGPP
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_EMPTY_HPP

Property changes on: src/mpt/base/math.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/memory.hpp
===================================================================
--- src/mpt/base/memory.hpp	(nonexistent)
+++ src/mpt/base/memory.hpp	(working copy)
@@ -0,0 +1,262 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_MEMORY_HPP
+#define MPT_BASE_MEMORY_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/span.hpp"
+
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+using byte_span = mpt::span<std::byte>;
+using const_byte_span = mpt::span<const std::byte>;
+
+
+
+// Tell which types are safe for mpt::byte_cast.
+// signed char is actually not allowed to alias into an object representation,
+// which means that, if the actual type is not itself signed char but char or
+// unsigned char instead, dereferencing the signed char pointer is undefined
+// behaviour.
+template <typename T>
+struct is_byte_castable : public std::false_type { };
+template <>
+struct is_byte_castable<char> : public std::true_type { };
+template <>
+struct is_byte_castable<unsigned char> : public std::true_type { };
+template <>
+struct is_byte_castable<std::byte> : public std::true_type { };
+template <>
+struct is_byte_castable<const char> : public std::true_type { };
+template <>
+struct is_byte_castable<const unsigned char> : public std::true_type { };
+template <>
+struct is_byte_castable<const std::byte> : public std::true_type { };
+
+
+template <typename T>
+struct is_byte : public std::false_type { };
+template <>
+struct is_byte<std::byte> : public std::true_type { };
+template <>
+struct is_byte<const std::byte> : public std::true_type { };
+
+
+template <typename T>
+constexpr bool declare_binary_safe(const T &) noexcept {
+	return false;
+}
+
+constexpr bool declare_binary_safe(const char &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8 &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8 &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const std::byte &) noexcept {
+	return true;
+}
+
+// Tell which types are safe to binary write into files.
+// By default, no types are safe.
+// When a safe type gets defined,
+// also specialize this template so that IO functions will work.
+template <typename T>
+struct is_binary_safe : public std::conditional<declare_binary_safe(T{}), std::true_type, std::false_type>::type { };
+
+// Generic Specialization for arrays.
+template <typename T, std::size_t N>
+struct is_binary_safe<T[N]> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<const T[N]> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<std::array<T, N>> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<const std::array<T, N>> : public is_binary_safe<T> { };
+
+
+template <typename T>
+constexpr bool check_binary_size(std::size_t size) noexcept {
+	return true
+		&& (sizeof(T) == size)
+		&& (alignof(T) == 1)
+		&& std::is_standard_layout<T>::value
+		&& std::has_unique_object_representations<T>::value
+		&& mpt::is_binary_safe<T>::value;
+}
+
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl {
+	inline Tdst operator()(Tsrc src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		// not checking is_byte_castable here because we are actually
+		// doing a static_cast and converting the value
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return static_cast<Tdst>(src);
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl<mpt::span<Tdst>, mpt::span<Tsrc>> {
+	inline mpt::span<Tdst> operator()(mpt::span<Tsrc> src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return mpt::as_span(mpt::byte_cast_impl<Tdst *, Tsrc *>()(src.data()), mpt::byte_cast_impl<Tdst *, Tsrc *>()(src.data() + src.size()));
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl<Tdst *, Tsrc *> {
+	inline Tdst * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct void_cast_impl;
+
+template <typename Tdst>
+struct void_cast_impl<Tdst *, void *> {
+	inline Tdst * operator()(void * src) const noexcept {
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tdst>
+struct void_cast_impl<Tdst *, const void *> {
+	inline Tdst * operator()(const void * src) const noexcept {
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tsrc>
+struct void_cast_impl<void *, Tsrc *> {
+	inline void * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		return reinterpret_cast<void *>(src);
+	}
+};
+
+template <typename Tsrc>
+struct void_cast_impl<const void *, Tsrc *> {
+	inline const void * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		return reinterpret_cast<const void *>(src);
+	}
+};
+
+// casts between different byte (char) types or pointers to these types
+template <typename Tdst, typename Tsrc>
+inline Tdst byte_cast(Tsrc src) noexcept {
+	return byte_cast_impl<Tdst, Tsrc>()(src);
+}
+
+// casts between pointers to void and pointers to byte
+template <typename Tdst, typename Tsrc>
+inline Tdst void_cast(Tsrc src) noexcept {
+	return void_cast_impl<Tdst, Tsrc>()(src);
+}
+
+
+
+template <typename T>
+MPT_CONSTEXPRINLINE std::byte as_byte(T src) noexcept {
+	static_assert(std::is_integral<T>::value);
+	return static_cast<std::byte>(static_cast<uint8>(src));
+}
+
+
+
+template <typename T>
+struct as_raw_memory_impl {
+	inline mpt::const_byte_span operator()(const T & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(&v), sizeof(T));
+	}
+	inline mpt::byte_span operator()(T & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(&v), sizeof(T));
+	}
+};
+
+template <typename T, std::size_t N>
+struct as_raw_memory_impl<T[N]> {
+	inline mpt::const_byte_span operator()(const T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v), N * sizeof(T));
+	}
+	inline mpt::byte_span operator()(T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(v), N * sizeof(T));
+	}
+};
+
+template <typename T, std::size_t N>
+struct as_raw_memory_impl<const T[N]> {
+	inline mpt::const_byte_span operator()(const T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v), N * sizeof(T));
+	}
+};
+
+// In order to be able to partially specialize it,
+// as_raw_memory is implemented via a class template.
+// Do not overload or specialize as_raw_memory directly.
+// Using a wrapper (by default just around a cast to const std::byte *),
+// allows for implementing raw memory access
+// via on-demand generating a cached serialized representation.
+template <typename T>
+inline mpt::const_byte_span as_raw_memory(const T & v) {
+	return mpt::as_raw_memory_impl<T>()(v);
+}
+template <typename T>
+inline mpt::byte_span as_raw_memory(T & v) {
+	return mpt::as_raw_memory_impl<T>()(v);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_MEMORY_HPP

Property changes on: src/mpt/base/memory.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/namespace.hpp
===================================================================
--- src/mpt/base/namespace.hpp	(nonexistent)
+++ src/mpt/base/namespace.hpp	(working copy)
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_NAMESPACE_HPP
+#define MPT_BASE_NAMESPACE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/version.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+
+
+#if !defined(MPT_INLINE_NS)
+
+#define MPT_BUILD_VERSION_NAMESPACE_IMPL(a, b, c, d) v##a##_##b##_##c##_##d
+#define MPT_BUILD_VERSION_NAMESPACE(a, b, c, d)      MPT_BUILD_VERSION_NAMESPACE_IMPL(a, b, c, d)
+
+#define MPT_VERSION_NAMESPACE MPT_BUILD_VERSION_NAMESPACE(MPT_VERSION_MAJOR, MPT_VERSION_MINOR, MPT_VERSION_PATCH, MPT_VERSION_BUILD)
+
+#if MPT_OS_WINDOWS
+#ifdef UNICODE
+#define MPT_VERSION_ABI_OS u
+#else
+#define MPT_VERSION_ABI_OS 8
+#endif
+#else
+#define MPT_VERSION_ABI_OS _
+#endif
+
+#if MPT_LIBC_GENERIC
+#define MPT_VERSION_ABI_LIBC _
+#elif MPT_LIBC_MS
+#ifdef _DLL
+#ifdef _DEBUG
+#define MPT_VERSION_ABI_LIBC MDd
+#else
+#define MPT_VERSION_ABI_LIBC MDr
+#endif
+#else
+#ifdef _DEBUG
+#define MPT_VERSION_ABI_LIBC MTd
+#else
+#define MPT_VERSION_ABI_LIBC MTr
+#endif
+#endif
+#elif MPT_LIBC_GLIBC
+#define MPT_VERSION_ABI_LIBC G
+#else
+#define MPT_VERSION_ABI_LIBC _
+#endif
+
+#define MPT_BUILD_ABI_NAMESPACE_IMPL(a, b) ABI_##a##_##b
+#define MPT_BUILD_ABI_NAMESPACE(a, b)      MPT_BUILD_ABI_NAMESPACE_IMPL(a, b)
+
+#define MPT_ABI_NAMESPACE MPT_BUILD_ABI_NAMESPACE(MPT_VERSION_ABI_OS, MPT_VERSION_ABI_LIBC)
+
+#if !defined(MPT_PROJECT_NAMESPACE)
+MPT_WARNING("Please #define MPT_PROJECT_NAMESPACE or #define MPT_INLINE_NS in build configuration.")
+#define MPT_PROJECT_NAMESPACE x
+#endif // !MPT_PROJECT_NAMESPACE
+
+#define MPT_BUILD_INLINE_NS_IMPL(a, b, c) a##_##b##_##c
+#define MPT_BUILD_INLINE_NS(a, b, c)      MPT_BUILD_INLINE_NS_IMPL(a, b, c)
+
+#define MPT_INLINE_NS MPT_BUILD_INLINE_NS(MPT_VERSION_NAMESPACE, MPT_ABI_NAMESPACE, MPT_PROJECT_NAMESPACE)
+
+#endif // !MPT_INLINE_NS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_NAMESPACE_HPP

Property changes on: src/mpt/base/namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/numeric.hpp
===================================================================
--- src/mpt/base/numeric.hpp	(nonexistent)
+++ src/mpt/base/numeric.hpp	(working copy)
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_NUMERIC_HPP
+#define MPT_BASE_NUMERIC_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/saturate_cast.hpp"
+
+#include <algorithm>
+#include <limits>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tmod, Tmod m>
+struct ModIfNotZeroImpl {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		static_assert(std::numeric_limits<Tmod>::is_integer);
+		static_assert(!std::numeric_limits<Tmod>::is_signed);
+		static_assert(std::numeric_limits<Tval>::is_integer);
+		static_assert(!std::numeric_limits<Tval>::is_signed);
+		return static_cast<Tval>(x % m);
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint8, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint16, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint32, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint64, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+
+// Returns x % m if m != 0, x otherwise.
+// i.e. "return (m == 0) ? x : (x % m);", but without causing a warning with stupid older compilers
+template <typename Tmod, Tmod m, typename Tval>
+constexpr Tval modulo_if_not_zero(Tval x) {
+	return ModIfNotZeroImpl<Tmod, m>().mod(x);
+}
+
+// rounds x up to multiples of target
+template <typename T>
+constexpr T align_up(T x, T target) {
+	return ((x + (target - 1)) / target) * target;
+}
+
+// rounds x down to multiples of target
+template <typename T>
+constexpr T align_down(T x, T target) {
+	return (x / target) * target;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALGORITHM_HPP

Property changes on: src/mpt/base/numeric.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/pointer.hpp
===================================================================
--- src/mpt/base/pointer.hpp	(nonexistent)
+++ src/mpt/base/pointer.hpp	(working copy)
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_POINTER_HPP
+#define MPT_BASE_POINTER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+inline constexpr int arch_bits = sizeof(void *) * 8;
+inline constexpr std::size_t pointer_size = sizeof(void *);
+
+
+template <typename Tdst, typename Tsrc>
+struct pointer_cast_helper {
+	static constexpr Tdst cast(const Tsrc & src) noexcept {
+		return src;
+	}
+};
+
+template <typename Tdst, typename Tptr>
+struct pointer_cast_helper<Tdst, const Tptr *> {
+	static constexpr Tdst cast(const Tptr * const & src) noexcept {
+		return reinterpret_cast<const Tdst>(src);
+	}
+};
+template <typename Tdst, typename Tptr>
+struct pointer_cast_helper<Tdst, Tptr *> {
+	static constexpr Tdst cast(const Tptr * const & src) noexcept {
+		return reinterpret_cast<const Tdst>(src);
+	}
+};
+
+
+template <typename Tdst, typename Tsrc>
+constexpr Tdst pointer_cast(const Tsrc & src) noexcept {
+	return pointer_cast_helper<Tdst, Tsrc>::cast(src);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_POINTER_HPP

Property changes on: src/mpt/base/pointer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/preprocessor.hpp
===================================================================
--- src/mpt/base/preprocessor.hpp	(nonexistent)
+++ src/mpt/base/preprocessor.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_PREPROCESSOR_HPP
+#define MPT_BASE_PREPROCESSOR_HPP
+
+
+
+#define MPT_PP_DEFER(m, ...) m(__VA_ARGS__)
+
+#define MPT_PP_STRINGIFY(x) #x
+
+#define MPT_PP_JOIN_HELPER(a, b) a##b
+#define MPT_PP_JOIN(a, b)        MPT_PP_JOIN_HELPER(a, b)
+
+#define MPT_PP_UNIQUE_IDENTIFIER(prefix) MPT_PP_JOIN(prefix, __LINE__)
+
+
+
+#endif // MPT_BASE_PREPROCESSOR_HPP

Property changes on: src/mpt/base/preprocessor.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/saturate_cast.hpp
===================================================================
--- src/mpt/base/saturate_cast.hpp	(nonexistent)
+++ src/mpt/base/saturate_cast.hpp	(working copy)
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SATURATE_CAST_HPP
+#define MPT_BASE_SATURATE_CAST_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Saturate the value of src to the domain of Tdst
+template <typename Tdst, typename Tsrc>
+constexpr Tdst saturate_cast(Tsrc src) noexcept {
+	// This code tries not only to obviously avoid overflows but also to avoid signed/unsigned comparison warnings and type truncation warnings (which in fact would be safe here) by explicit casting.
+	static_assert(std::numeric_limits<Tdst>::is_integer);
+	static_assert(std::numeric_limits<Tsrc>::is_integer);
+	if constexpr (std::numeric_limits<Tdst>::is_signed && std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(std::numeric_limits<Tdst>::min()), std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))));
+		}
+	} else if constexpr (!std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		}
+	} else if constexpr (std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) > sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else if constexpr (sizeof(Tdst) == sizeof(Tsrc)) {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		} else {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		}
+	} else { // Tdst unsigned, Tsrc signed
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(0), src));
+		} else {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(0), std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))));
+		}
+	}
+}
+
+template <typename Tdst>
+constexpr Tdst saturate_cast(double src) {
+	if (src >= static_cast<double>(std::numeric_limits<Tdst>::max())) {
+		return std::numeric_limits<Tdst>::max();
+	}
+	if (src <= static_cast<double>(std::numeric_limits<Tdst>::min())) {
+		return std::numeric_limits<Tdst>::min();
+	}
+	return static_cast<Tdst>(src);
+}
+
+template <typename Tdst>
+constexpr Tdst saturate_cast(float src) {
+	if (src >= static_cast<float>(std::numeric_limits<Tdst>::max())) {
+		return std::numeric_limits<Tdst>::max();
+	}
+	if (src <= static_cast<float>(std::numeric_limits<Tdst>::min())) {
+		return std::numeric_limits<Tdst>::min();
+	}
+	return static_cast<Tdst>(src);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SATURATE_CAST_HPP

Property changes on: src/mpt/base/saturate_cast.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/saturate_round.hpp
===================================================================
--- src/mpt/base/saturate_round.hpp	(nonexistent)
+++ src/mpt/base/saturate_round.hpp	(working copy)
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SATURATE_ROUND_HPP
+#define MPT_BASE_SATURATE_ROUND_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/math.hpp"
+#include "mpt/base/saturate_cast.hpp"
+
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Rounds given double value to nearest integer value of type T.
+// Out-of-range values are saturated to the specified integer type's limits.
+
+template <typename T>
+inline T saturate_round(float val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+template <typename T>
+inline T saturate_round(double val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+template <typename T>
+inline T saturate_round(long double val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SATURATE_ROUND_HPP

Property changes on: src/mpt/base/saturate_round.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/secure.hpp
===================================================================
--- src/mpt/base/secure.hpp	(nonexistent)
+++ src/mpt/base/secure.hpp	(working copy)
@@ -0,0 +1,198 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SECURE_HPP
+#define MPT_BASE_SECURE_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <atomic>
+#include <utility>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace secure {
+
+
+
+inline MPT_NOINLINE void memzero(std::byte * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = static_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(void * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = static_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(char * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = reinterpret_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(uint8 * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = reinterpret_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+
+
+template <typename T>
+inline MPT_NOINLINE void clear(T & val) {
+	std::atomic_signal_fence(std::memory_order_seq_cst);
+	volatile T * volatile v = &val;
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	*v = T{};
+	std::atomic_signal_fence(std::memory_order_seq_cst);
+}
+
+
+
+class byte {
+private:
+	std::byte value;
+
+public:
+	byte() noexcept
+		: value(std::byte{0}) {
+		return;
+	}
+	explicit byte(std::byte value) noexcept
+		: value(value) {
+		return;
+	}
+	byte(const byte & other) noexcept
+		: value(other.value) {
+		return;
+	}
+	byte(byte && other) noexcept
+		: value(std::move(other.value)) {
+		mpt::secure::clear(other.value);
+	}
+	byte & operator=(const byte & other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		value = other.value;
+		return *this;
+	}
+	byte & operator==(byte && other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		value = std::move(other.value);
+		mpt::secure::clear(other.value);
+		return *this;
+	}
+	explicit operator std::byte() const noexcept {
+		return value;
+	}
+	~byte() {
+		mpt::secure::clear(value);
+	}
+};
+
+
+
+class buffer {
+private:
+	std::vector<std::byte> m_data;
+
+public:
+	buffer()
+		: m_data(0) {
+		return;
+	}
+	explicit buffer(const std::vector<std::byte> & data)
+		: m_data(data) {
+		return;
+	}
+	explicit buffer(const std::byte * beg, const std::byte * end)
+		: m_data(beg, end) {
+		return;
+	}
+	buffer(const buffer & other)
+		: m_data(other.m_data) {
+		return;
+	}
+	buffer(buffer && other) noexcept
+		: m_data(std::move(other.m_data)) {
+		mpt::secure::memzero(other.m_data.data(), other.m_data.size());
+	}
+	buffer & operator=(const buffer & other) {
+		if (&other == this) {
+			return *this;
+		}
+		m_data = other.m_data;
+		return *this;
+	}
+	buffer & operator=(buffer && other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		m_data = std::move(other.m_data);
+		mpt::secure::memzero(other.m_data.data(), other.m_data.size());
+		return *this;
+	}
+	~buffer() {
+		mpt::secure::memzero(m_data.data(), m_data.size());
+		m_data.resize(0);
+		m_data.shrink_to_fit();
+	}
+	explicit operator std::vector<std::byte>() const {
+		return m_data;
+	}
+	const std::byte * data() const {
+		return m_data.data();
+	}
+	std::byte * data() {
+		return m_data.data();
+	}
+	std::size_t size() const {
+		return m_data.size();
+	}
+};
+
+
+
+} // namespace secure
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SECURE_HPP

Property changes on: src/mpt/base/secure.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/semantic_version.hpp
===================================================================
--- src/mpt/base/semantic_version.hpp	(nonexistent)
+++ src/mpt/base/semantic_version.hpp	(working copy)
@@ -0,0 +1,94 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SEMANTIC_VERSION_HPP
+#define MPT_BASE_SEMANTIC_VERSION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/version.hpp"
+
+
+
+#include <tuple>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+struct semantic_version {
+	unsigned long long major = 0;
+	unsigned long long minor = 0;
+	unsigned long long patch = 0;
+	constexpr std::tuple<unsigned long long, unsigned long long, unsigned long long> as_tuple() const noexcept {
+		return std::make_tuple(major, minor, patch);
+	}
+};
+
+constexpr bool operator==(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() == b.as_tuple();
+}
+constexpr bool operator!=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() != b.as_tuple();
+}
+constexpr bool operator<(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() < b.as_tuple();
+}
+constexpr bool operator>(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() > b.as_tuple();
+}
+constexpr bool operator<=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() <= b.as_tuple();
+}
+constexpr bool operator>=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() >= b.as_tuple();
+}
+
+struct version_info {
+	semantic_version semver{};
+	unsigned long long build = 0;
+	constexpr std::tuple<std::tuple<unsigned long long, unsigned long long, unsigned long long>, unsigned long long> as_tuple() const noexcept {
+		return std::make_tuple(semver.as_tuple(), build);
+	}
+	template <typename Tostream>
+	friend Tostream & operator<<(Tostream & os, version_info const vi) {
+		if (vi.build > 0) {
+			os << vi.semver.major << "." << vi.semver.minor << "." << vi.semver.patch << "+build." << vi.build;
+		} else {
+			os << vi.semver.major << "." << vi.semver.minor << "." << vi.semver.patch;
+		}
+		return os;
+	}
+};
+
+constexpr bool operator==(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() == b.as_tuple();
+}
+constexpr bool operator!=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() != b.as_tuple();
+}
+constexpr bool operator<(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() < b.as_tuple();
+}
+constexpr bool operator>(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() > b.as_tuple();
+}
+constexpr bool operator<=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() <= b.as_tuple();
+}
+constexpr bool operator>=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() >= b.as_tuple();
+}
+
+constexpr inline version_info Version = {{MPT_VERSION_MAJOR, MPT_VERSION_MINOR, MPT_VERSION_PATCH}, MPT_VERSION_BUILD};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SEMANTIC_VERSION_HPP

Property changes on: src/mpt/base/semantic_version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/source_location.hpp
===================================================================
--- src/mpt/base/source_location.hpp	(nonexistent)
+++ src/mpt/base/source_location.hpp	(working copy)
@@ -0,0 +1,115 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SOURCE_LOCATION_HPP
+#define MPT_BASE_SOURCE_LOCATION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <source_location>
+#endif // C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::source_location;
+
+#define MPT_SOURCE_LOCATION_CURRENT() std::source_location::current()
+
+#else // !C++20
+
+#if MPT_COMPILER_MSVC && MPT_MSVC_AT_LEAST(2019, 6)
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   __builtin_COLUMN()
+
+#elif MPT_COMPILER_GCC
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   0
+
+#elif MPT_COMPILER_CLANG && MPT_CLANG_AT_LEAST(9, 0, 0)
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   __builtin_COLUMN()
+
+#else
+
+#define MPT_SOURCE_LOCATION_FILE     __FILE__
+#define MPT_SOURCE_LOCATION_FUNCTION ""
+#define MPT_SOURCE_LOCATION_LINE     __LINE__
+#define MPT_SOURCE_LOCATION_COLUMN   0
+
+#endif
+
+// compatible with C++20 std::source_location
+struct source_location {
+private:
+	const char * m_file_name;
+	const char * m_function_name;
+	uint32 m_line;
+	uint32 m_column;
+
+public:
+	constexpr source_location() noexcept
+		: m_file_name("")
+		, m_function_name("")
+		, m_line(0)
+		, m_column(0) {
+	}
+	constexpr source_location(const char * file, const char * function, uint32 line, uint32 column) noexcept
+		: m_file_name(file)
+		, m_function_name(function)
+		, m_line(line)
+		, m_column(column) {
+	}
+	source_location(const source_location &) = default;
+	source_location(source_location &&) = default;
+	static constexpr source_location current(const char * file = MPT_SOURCE_LOCATION_FILE, const char * function = MPT_SOURCE_LOCATION_FUNCTION, uint32 line = MPT_SOURCE_LOCATION_LINE, uint32 column = MPT_SOURCE_LOCATION_COLUMN) noexcept {
+		return source_location(file, function, line, column);
+	}
+	constexpr uint32 line() const noexcept {
+		return m_line;
+	}
+	constexpr uint32 column() const noexcept {
+		return m_column;
+	}
+	constexpr const char * file_name() const noexcept {
+		return m_file_name;
+	}
+	constexpr const char * function_name() const noexcept {
+		return m_function_name;
+	}
+};
+
+
+#if (MPT_COMPILER_MSVC && MPT_MSVC_AT_LEAST(2019, 6)) || MPT_COMPILER_GCC || (MPT_COMPILER_CLANG && MPT_CLANG_AT_LEAST(9, 0, 0))
+#define MPT_SOURCE_LOCATION_CURRENT() mpt::source_location::current()
+#else
+#define MPT_SOURCE_LOCATION_CURRENT() mpt::source_location::current(__FILE__, __func__, __LINE__, 0)
+#endif
+
+#endif // C++20
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SOURCE_LOCATION_HPP

Property changes on: src/mpt/base/source_location.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/span.hpp
===================================================================
--- src/mpt/base/span.hpp	(nonexistent)
+++ src/mpt/base/span.hpp	(working copy)
@@ -0,0 +1,213 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SPAN_HPP
+#define MPT_BASE_SPAN_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#if MPT_CXX_AT_LEAST(20)
+#include <span>
+#else // !C++20
+#include <iterator>
+#include <limits>
+#include <type_traits>
+#endif // C++20
+
+#if MPT_CXX_BEFORE(20)
+#include <cstddef>
+#endif // !C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::dynamic_extent;
+using std::span;
+
+#else // !C++20
+
+//  Simplified version of gsl::span.
+//  Non-owning read-only or read-write view into a contiguous block of T
+// objects, i.e. equivalent to a (beg,end) or (data,size) tuple.
+//  Can eventually be replaced without further modifications with a full C++20
+// std::span.
+
+inline constexpr std::size_t dynamic_extent = std::numeric_limits<std::size_t>::max();
+
+template <typename T>
+class span {
+
+public:
+	using element_type = T;
+	using value_type = typename std::remove_cv<T>::type;
+	using index_type = std::size_t;
+	using pointer = T *;
+	using const_pointer = const T *;
+	using reference = T &;
+	using const_reference = const T &;
+
+	using iterator = pointer;
+	using const_iterator = const_pointer;
+
+	using difference_type = typename std::iterator_traits<iterator>::difference_type;
+
+private:
+	T * m_beg;
+	T * m_end;
+
+public:
+	span() noexcept
+		: m_beg(nullptr)
+		, m_end(nullptr) {
+	}
+
+	span(pointer beg, pointer end)
+		: m_beg(beg)
+		, m_end(end) {
+	}
+
+	span(pointer data, index_type size)
+		: m_beg(data)
+		, m_end(data + size) {
+	}
+
+	template <std::size_t N>
+	span(element_type (&arr)[N])
+		: m_beg(arr)
+		, m_end(arr + N) {
+	}
+
+	template <std::size_t N>
+	span(std::array<value_type, N> & arr)
+		: m_beg(arr.data())
+		, m_end(arr.data() + arr.size()) {
+	}
+
+	template <std::size_t N>
+	span(const std::array<value_type, N> & arr)
+		: m_beg(arr.data())
+		, m_end(arr.data() + arr.size()) {
+	}
+
+	span(const span & other) noexcept = default;
+
+	template <typename U>
+	span(const span<U> & other)
+		: m_beg(other.begin())
+		, m_end(other.end()) {
+	}
+
+	span & operator=(const span & other) noexcept = default;
+
+	iterator begin() const {
+		return iterator(m_beg);
+	}
+
+	iterator end() const {
+		return iterator(m_end);
+	}
+
+	const_iterator cbegin() const {
+		return const_iterator(begin());
+	}
+
+	const_iterator cend() const {
+		return const_iterator(end());
+	}
+
+	reference operator[](index_type index) {
+		return at(index);
+	}
+
+	const_reference operator[](index_type index) const {
+		return at(index);
+	}
+
+	bool operator==(span const & other) const noexcept {
+		return size() == other.size() && (m_beg == other.m_beg || std::equal(begin(), end(), other.begin()));
+	}
+
+	bool operator!=(span const & other) const noexcept {
+		return !(*this == other);
+	}
+
+	reference at(index_type index) {
+		return m_beg[index];
+	}
+
+	const_reference at(index_type index) const {
+		return m_beg[index];
+	}
+
+	pointer data() const noexcept {
+		return m_beg;
+	}
+
+	bool empty() const noexcept {
+		return size() == 0;
+	}
+
+	index_type size() const noexcept {
+		return static_cast<index_type>(std::distance(m_beg, m_end));
+	}
+
+	index_type length() const noexcept {
+		return size();
+	}
+
+	span subspan(std::size_t offset, std::size_t count = mpt::dynamic_extent) const {
+		return span(data() + offset, (count == mpt::dynamic_extent) ? (size() - offset) : count);
+	}
+
+	span first(std::size_t count) const {
+		return span(data(), count);
+	}
+
+	span last(std::size_t count) const {
+		return span(data() + (size() - count), count);
+	}
+
+}; // class span
+
+#endif // C++20
+
+template <typename T>
+inline span<T> as_span(T * beg, T * end) {
+	return span<T>(beg, end);
+}
+
+template <typename T>
+inline span<T> as_span(T * data, std::size_t size) {
+	return span<T>(data, size);
+}
+
+template <typename T, std::size_t N>
+inline span<T> as_span(T (&arr)[N]) {
+	return span<T>(std::begin(arr), std::end(arr));
+}
+
+template <typename T, std::size_t N>
+inline span<T> as_span(std::array<T, N> & cont) {
+	return span<T>(cont);
+}
+
+template <typename T, std::size_t N>
+inline span<const T> as_span(const std::array<T, N> & cont) {
+	return span<const T>(cont);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SPAN_HPP

Property changes on: src/mpt/base/span.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_arithmetic_shift.hpp
===================================================================
--- src/mpt/base/tests/tests_base_arithmetic_shift.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_arithmetic_shift.hpp	(working copy)
@@ -0,0 +1,314 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP
+#define MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP
+
+
+
+#include "mpt/base/arithmetic_shift.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_arithmetic_shift{
+	"mpt/base/arithmetic_shift",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 1), mpt::rshift_signed_standard<int16>(-32768, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 1), mpt::rshift_signed_standard<int16>(-32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 1), mpt::rshift_signed_standard<int16>(-32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 1), mpt::rshift_signed_standard<int16>(-2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 1), mpt::rshift_signed_standard<int16>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 1), mpt::rshift_signed_standard<int16>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 1), mpt::rshift_signed_standard<int16>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 1), mpt::rshift_signed_standard<int16>(2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 1), mpt::rshift_signed_standard<int16>(32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 1), mpt::rshift_signed_standard<int16>(32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 14), mpt::rshift_signed_standard<int16>(-32768, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 14), mpt::rshift_signed_standard<int16>(-32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 14), mpt::rshift_signed_standard<int16>(-32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 14), mpt::rshift_signed_standard<int16>(-2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 14), mpt::rshift_signed_standard<int16>(-1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 14), mpt::rshift_signed_standard<int16>(0, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 14), mpt::rshift_signed_standard<int16>(1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 14), mpt::rshift_signed_standard<int16>(2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 14), mpt::rshift_signed_standard<int16>(32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 14), mpt::rshift_signed_standard<int16>(32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 15), mpt::rshift_signed_standard<int16>(-32768, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 15), mpt::rshift_signed_standard<int16>(-32767, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 15), mpt::rshift_signed_standard<int16>(-32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 15), mpt::rshift_signed_standard<int16>(-2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 15), mpt::rshift_signed_standard<int16>(-1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 15), mpt::rshift_signed_standard<int16>(0, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 15), mpt::rshift_signed_standard<int16>(1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 15), mpt::rshift_signed_standard<int16>(2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 15), mpt::rshift_signed_standard<int16>(32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 15), mpt::rshift_signed_standard<int16>(32767, 15));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 1), mpt::lshift_signed_standard<int16>(-32768, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 1), mpt::lshift_signed_standard<int16>(-32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 1), mpt::lshift_signed_standard<int16>(-32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 1), mpt::lshift_signed_standard<int16>(-2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 1), mpt::lshift_signed_standard<int16>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 1), mpt::lshift_signed_standard<int16>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 1), mpt::lshift_signed_standard<int16>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 1), mpt::lshift_signed_standard<int16>(2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 1), mpt::lshift_signed_standard<int16>(32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 1), mpt::lshift_signed_standard<int16>(32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 14), mpt::lshift_signed_standard<int16>(-32768, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 14), mpt::lshift_signed_standard<int16>(-32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 14), mpt::lshift_signed_standard<int16>(-32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 14), mpt::lshift_signed_standard<int16>(-2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 14), mpt::lshift_signed_standard<int16>(-1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 14), mpt::lshift_signed_standard<int16>(0, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 14), mpt::lshift_signed_standard<int16>(1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 14), mpt::lshift_signed_standard<int16>(2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 14), mpt::lshift_signed_standard<int16>(32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 14), mpt::lshift_signed_standard<int16>(32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 15), mpt::lshift_signed_standard<int16>(-32768, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 15), mpt::lshift_signed_standard<int16>(-32767, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 15), mpt::lshift_signed_standard<int16>(-32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 15), mpt::lshift_signed_standard<int16>(-2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 15), mpt::lshift_signed_standard<int16>(-1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 15), mpt::lshift_signed_standard<int16>(0, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 15), mpt::lshift_signed_standard<int16>(1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 15), mpt::lshift_signed_standard<int16>(2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 15), mpt::lshift_signed_standard<int16>(32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 15), mpt::lshift_signed_standard<int16>(32767, 15));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 1), (-32768) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 1), (-32767) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 1), (-32766) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 1), (-2) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 1), (-1) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 1), (0) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 1), (1) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 1), (2) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 1), (32766) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 1), (32767) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 14), (-32768) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 14), (-32767) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 14), (-32766) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 14), (-2) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 14), (-1) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 14), (0) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 14), (1) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 14), (2) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 14), (32766) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 14), (32767) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 15), (-32768) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 15), (-32767) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 15), (-32766) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 15), (-2) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 15), (-1) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 15), (0) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 15), (1) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 15), (2) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 15), (32766) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 15), (32767) >> 15);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 1), (-32768) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 1), (-32767) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 1), (-32766) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 1), (-2) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 1), (-1) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 1), (0) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 1), (1) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 1), (2) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 1), (32766) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 1), (32767) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 14), (-32768) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 14), (-32767) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 14), (-32766) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 14), (-2) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 14), (-1) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 14), (0) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 14), (1) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 14), (2) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 14), (32766) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 14), (32767) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 15), (-32768) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 15), (-32767) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 15), (-32766) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 15), (-2) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 15), (-1) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 15), (0) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 15), (1) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 15), (2) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 15), (32766) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 15), (32767) << 15);
+
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 1), mpt::rshift_signed_standard<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 1), mpt::rshift_signed_standard<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 1), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 1), mpt::rshift_signed_standard<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 1), mpt::rshift_signed_standard<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 1), mpt::rshift_signed_standard<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 1), mpt::rshift_signed_standard<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 1), mpt::rshift_signed_standard<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 31), mpt::rshift_signed_standard<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_standard<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 31), mpt::rshift_signed_standard<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 31), mpt::rshift_signed_standard<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 31), mpt::rshift_signed_standard<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 31), mpt::rshift_signed_standard<int32>(0x7fffffff, 31));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 1), mpt::lshift_signed_standard<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 1), mpt::lshift_signed_standard<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 1), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 1), mpt::lshift_signed_standard<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 1), mpt::lshift_signed_standard<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 1), mpt::lshift_signed_standard<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 1), mpt::lshift_signed_standard<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 1), mpt::lshift_signed_standard<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 31), mpt::lshift_signed_standard<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_standard<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 31), mpt::lshift_signed_standard<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 31), mpt::lshift_signed_standard<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 31), mpt::lshift_signed_standard<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 31), mpt::lshift_signed_standard<int32>(0x7fffffff, 31));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 1), mpt::rshift_signed_undefined<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 1), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 1), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 1), mpt::rshift_signed_undefined<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 1), mpt::rshift_signed_undefined<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 1), mpt::rshift_signed_undefined<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 1), mpt::rshift_signed_undefined<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 1), mpt::rshift_signed_undefined<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 31), mpt::rshift_signed_undefined<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 31), mpt::rshift_signed_undefined<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 31), mpt::rshift_signed_undefined<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 31), mpt::rshift_signed_undefined<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(0x7fffffff, 31));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 1), mpt::lshift_signed_undefined<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 1), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 1), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 1), mpt::lshift_signed_undefined<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 1), mpt::lshift_signed_undefined<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 1), mpt::lshift_signed_undefined<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 1), mpt::lshift_signed_undefined<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 1), mpt::lshift_signed_undefined<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 31), mpt::lshift_signed_undefined<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 31), mpt::lshift_signed_undefined<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 31), mpt::lshift_signed_undefined<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 31), mpt::lshift_signed_undefined<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(0x7fffffff, 31));
+
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::rshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 1), mpt::rshift_signed_standard<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 1), mpt::rshift_signed_standard<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 1), mpt::rshift_signed_standard<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::rshift_signed_standard<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::rshift_signed_standard<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::rshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 63), mpt::rshift_signed_standard<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 63), mpt::rshift_signed_standard<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 63), mpt::rshift_signed_standard<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(0x7fffffffffffffffll, 63));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::lshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 1), mpt::lshift_signed_standard<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 1), mpt::lshift_signed_standard<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 1), mpt::lshift_signed_standard<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::lshift_signed_standard<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::lshift_signed_standard<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::lshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 63), mpt::lshift_signed_standard<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 63), mpt::lshift_signed_standard<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 63), mpt::lshift_signed_standard<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(0x7fffffffffffffffll, 63));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::rshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 1), mpt::rshift_signed_undefined<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 1), mpt::rshift_signed_undefined<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 1), mpt::rshift_signed_undefined<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::rshift_signed_undefined<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::rshift_signed_undefined<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::rshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 63), mpt::rshift_signed_undefined<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 63), mpt::rshift_signed_undefined<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 63), mpt::rshift_signed_undefined<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(0x7fffffffffffffffll, 63));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::lshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 1), mpt::lshift_signed_undefined<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 1), mpt::lshift_signed_undefined<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 1), mpt::lshift_signed_undefined<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::lshift_signed_undefined<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::lshift_signed_undefined<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::lshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 63), mpt::lshift_signed_undefined<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 63), mpt::lshift_signed_undefined<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 63), mpt::lshift_signed_undefined<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(0x7fffffffffffffffll, 63));
+
+#endif
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP

Property changes on: src/mpt/base/tests/tests_base_arithmetic_shift.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_bit.hpp
===================================================================
--- src/mpt/base/tests/tests_base_bit.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_bit.hpp	(working copy)
@@ -0,0 +1,214 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_BASE_BIT_HPP
+#define MPT_BASE_TESTS_BASE_BIT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_bit{
+	"mpt/base/bit",
+	[](mpt::test::context & context) {
+
+#if MPT_CXX_BEFORE(20)
+		MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian_probe());
+#endif
+		MPT_MAYBE_CONSTANT_IF(mpt::endian_is_little()) {
+			MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::little);
+			MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+				MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::little);
+			}
+#if MPT_CXX_BEFORE(20)
+			MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::little);
+#endif
+		}
+		MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big()) {
+			MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::big);
+			MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+				MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::big);
+			}
+#if MPT_CXX_BEFORE(20)
+			MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::big);
+#endif
+		}
+
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(static_cast<uint32>(int32(-1))), 32);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(0u), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(1u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(2u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(3u), 2);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(0u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(1u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(2u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(3u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(4u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(5u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(6u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(7u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(8u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(9u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x7fffffffu)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x80000000u)), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x80000001u)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0xfffffffeu)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0xffffffffu)), false);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(0u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(3u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(4u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(5u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(6u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(7u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(8u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(9u), 16u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x7fffffffu)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x80000000u)), 0x80000000u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x80000001u)), 0u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0xfffffffeu)), 0u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0xffffffffu)), 0u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(0u), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(3u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(4u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(5u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(6u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(7u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(8u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(9u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x7fffffffu)), 0x40000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x80000000u)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x80000001u)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xfffffffeu)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xffffffffu)), 0x80000000u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(0u), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(3u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(4u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(5u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(6u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(7u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(8u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(9u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x7fffffffu)), 31u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000000u)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000001u)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xfffffffeu)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xffffffffu)), 32u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000001)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000011)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00001111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00011111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b01111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111111)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111110)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111100)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111000)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11110000)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11100000)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11000000)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b10000000)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000001)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000011)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000111)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00001111)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00011111)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00111111)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b01111111)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111110)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111100)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11110000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11100000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b10000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000001)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000011)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000111)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00001111)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00011111)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00111111)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b01111111)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111111)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111110)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111100)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11110000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11100000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b10000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000001)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000011)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00001111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00011111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b01111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111110)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111100)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111000)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11110000)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11100000)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11000000)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b10000000)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0xffffffffu), 32);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0xfffffffeu), 31);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x80000000u), 31);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x7fffffffu), 31);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x7ffffffeu), 30);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000007u), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000006u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000005u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000004u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000003u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000002u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000001u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000000u), 0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_BASE_BIT_HPP

Property changes on: src/mpt/base/tests/tests_base_bit.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_math.hpp
===================================================================
--- src/mpt/base/tests/tests_base_math.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_math.hpp	(working copy)
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_MATH_HPP
+#define MPT_BASE_TESTS_MATH_HPP
+
+
+
+#include "mpt/base/math.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_math{
+	"mpt/base/math",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.99), 2.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.5), 2.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.1), 1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.1), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.5), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.9), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-1.4), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-1.7), -2.0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_MATH_HPP

Property changes on: src/mpt/base/tests/tests_base_math.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_saturate_cast.hpp
===================================================================
--- src/mpt/base/tests/tests_base_saturate_cast.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_saturate_cast.hpp	(working copy)
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_SATURATE_CAST_HPP
+#define MPT_BASE_TESTS_SATURATE_CAST_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_saturate_cast{
+	"mpt/base/saturate_cast",
+	[](mpt::test::context & context) {
+		// trivials
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(-1), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(0), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(1), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(std::numeric_limits<int>::min()), std::numeric_limits<int>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(std::numeric_limits<int>::max()), std::numeric_limits<int>::max());
+
+		// signed / unsigned
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<uint16>::min()), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<uint16>::max()), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint32>::min()), (int32)std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint32>::max()), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int64>(std::numeric_limits<uint64>::min()), (int64)std::numeric_limits<uint64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int64>(std::numeric_limits<uint64>::max()), std::numeric_limits<int64>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min()), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max()), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min()), std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max()), (uint32)std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint64>(std::numeric_limits<int64>::min()), std::numeric_limits<uint64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint64>(std::numeric_limits<int64>::max()), (uint64)std::numeric_limits<int64>::max());
+
+		// overflow
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<int16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<int16>::max() + 1), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<int32>::max() + int64(1)), std::numeric_limits<int32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max() + 1), (uint16)std::numeric_limits<int16>::max() + 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max() + int64(1)), (uint32)std::numeric_limits<int32>::max() + 1);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(int16(32000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(int16(-32000)), -128);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(uint16(32000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(uint16(64000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(int16(32000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(int16(-32000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(uint16(32000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(uint16(64000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(int16(-32000)), -32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(uint16(64000)), 32767);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(int16(-32000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(uint16(64000)), 64000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(int16(-32000)), -32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(uint16(64000)), 64000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(int16(32000)), 32000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(int16(-32000)), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(uint16(32000)), 32000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(uint16(64000)), 64000u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int64>::max() - 1), std::numeric_limits<uint32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint64>::max() - 1), std::numeric_limits<int32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(static_cast<double>(std::numeric_limits<int64>::max())), std::numeric_limits<uint32>::max());
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_SATURATE_CAST_HPP

Property changes on: src/mpt/base/tests/tests_base_saturate_cast.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_saturate_round.hpp
===================================================================
--- src/mpt/base/tests/tests_base_saturate_round.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_saturate_round.hpp	(working copy)
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_SATURATE_ROUND_HPP
+#define MPT_BASE_TESTS_SATURATE_ROUND_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_round.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_saturate_round{
+	"mpt/base/saturate_round",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::max() + 0.1), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::max() - 0.4), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::min() + 0.1), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::min() - 0.1), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<uint32>(std::numeric_limits<uint32>::max() + 0.499), std::numeric_limits<uint32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(110.1), 110);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(-110.1), -110);
+
+		// These should fail to compile
+		//mpt::saturate_round<std::string>(1.0);
+		//mpt::saturate_round<int64>(1.0);
+		//mpt::saturate_round<uint64>(1.0);
+
+		// This should trigger assert in Round.
+		//MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(-129), 0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_SATURATE_ROUND_HPP

Property changes on: src/mpt/base/tests/tests_base_saturate_round.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_wrapping_divide.hpp
===================================================================
--- src/mpt/base/tests/tests_base_wrapping_divide.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_wrapping_divide.hpp	(working copy)
@@ -0,0 +1,163 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP
+#define MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/wrapping_divide.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_wrapping_divide{
+	"mpt/base/wrapping_divide",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-25, 12), 11);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-24, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-23, 12), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-8, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-7, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-6, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-5, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-4, 7), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-3, 7), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-2, 7), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-1, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(0, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(0, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(1, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(2, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(3, 7), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(4, 7), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(5, 7), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(6, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(7, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(8, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(23, 12), 11);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(24, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(25, 12), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(uint32(0x7fffffff), uint32(0x80000000)), uint32(0x7fffffff));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0x7ffffffe), int32(0x7fffffff)), int32(0x7ffffffe));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(2)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(2)), int32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(2)), int32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7fffffff)), int32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7fffffff)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7fffffff)), int32(1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffe)), int32(0x7ffffffc));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7ffffffe)), int32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7ffffffe)), int32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffd)), int32(0x7ffffffa));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7ffffffd)), int32(0x7ffffffb));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7ffffffd)), int32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), int32(0x7fffffff)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7fffffff)), int32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7fffffff)), int32(0x7ffffffd));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), int32(0x7ffffffe)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7ffffffe)), int32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7ffffffe)), int32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(2)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(2)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(2)), uint32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x40000001), uint32(0xffffffff)), uint32(0xbffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x40000000), uint32(0xffffffff)), uint32(0xbfffffff));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x3fffffff), uint32(0xffffffff)), uint32(0xc0000000));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000000)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000000)), uint32(2));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000001)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000001)), uint32(2));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000001)), uint32(3));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000000)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000000)), uint32(2));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7fffffff)), uint32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7fffffff)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7fffffff)), uint32(1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffe)), uint32(0x7ffffffc));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7ffffffe)), uint32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7ffffffe)), uint32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffd)), uint32(0x7ffffffa));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7ffffffd)), uint32(0x7ffffffb));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7ffffffd)), uint32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), uint32(0x7fffffff)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7fffffff)), uint32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7fffffff)), uint32(0x7ffffffd));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), uint32(0x7ffffffe)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7ffffffe)), uint32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7ffffffe)), uint32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-15, 7), -3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-14, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-13, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-12, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-11, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-10, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-9, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-8, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-7, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-6, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-5, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-4, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-3, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-2, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-1, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(0, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(1, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(2, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(3, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(4, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(5, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(6, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(7, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(8, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(9, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(10, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(11, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(12, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(13, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(14, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(15, 7), 2);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP

Property changes on: src/mpt/base/tests/tests_base_wrapping_divide.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/utility.hpp
===================================================================
--- src/mpt/base/utility.hpp	(nonexistent)
+++ src/mpt/base/utility.hpp	(working copy)
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_UTILITY_HPP
+#define MPT_BASE_UTILITY_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_CXX_BEFORE(20)
+#include "mpt/base/saturate_cast.hpp"
+#endif
+
+#include <type_traits>
+#include <utility>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::in_range;
+
+#else
+
+// Returns true iff Tdst can represent the value val.
+// Use as if(mpt::in_range<uint8>(-1)).
+template <typename Tdst, typename Tsrc>
+constexpr bool in_range(Tsrc val) {
+	return (static_cast<Tsrc>(mpt::saturate_cast<Tdst>(val)) == val);
+}
+
+#endif
+
+
+#if MPT_CXX_AT_LEAST(23)
+
+using std::to_underlying;
+
+#else
+
+template <typename T>
+constexpr std::underlying_type_t<T> to_underlying(T value) noexcept {
+	return static_cast<typename std::underlying_type<T>::type>(value);
+}
+
+#endif
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_UTILITY_HPP

Property changes on: src/mpt/base/utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/version.hpp
===================================================================
--- src/mpt/base/version.hpp	(nonexistent)
+++ src/mpt/base/version.hpp	(working copy)
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_VERSION_HPP
+#define MPT_BASE_VERSION_HPP
+
+
+
+#define MPT_VERSION_MAJOR 0
+#define MPT_VERSION_MINOR 0
+#define MPT_VERSION_PATCH 0
+#define MPT_VERSION_BUILD 0
+
+
+
+#endif // MPT_BASE_VERSION_HPP

Property changes on: src/mpt/base/version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/wrapping_divide.hpp
===================================================================
--- src/mpt/base/wrapping_divide.hpp	(nonexistent)
+++ src/mpt/base/wrapping_divide.hpp	(working copy)
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_WRAPPING_DIVIDE_HPP
+#define MPT_BASE_WRAPPING_DIVIDE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Modulo with more intuitive behaviour for some contexts:
+// Instead of being symmetrical around 0, the pattern for positive numbers is repeated in the negative range.
+// For example, wrapping_modulo(-1, m) == (m - 1).
+// Behaviour is undefined if m<=0.
+template <typename T, typename M>
+constexpr auto wrapping_modulo(T x, M m) -> decltype(x % m) {
+	return (x >= 0) ? (x % m) : (m - 1 - ((-1 - x) % m));
+}
+
+template <typename T, typename D>
+constexpr auto wrapping_divide(T x, D d) -> decltype(x / d) {
+	return (x >= 0) ? (x / d) : (((x + 1) / d) - 1);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_WRAPPING_DIVIDE_HPP

Property changes on: src/mpt/base/wrapping_divide.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/algorithm.hpp
===================================================================
--- src/mpt/base/algorithm.hpp	(nonexistent)
+++ src/mpt/base/algorithm.hpp	(working copy)
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ALGORITHM_HPP
+#define MPT_BASE_ALGORITHM_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/saturate_cast.hpp"
+
+#include <algorithm>
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Grows x with an exponential factor suitable for increasing buffer sizes.
+// Clamps the result at limit.
+// And avoids integer overflows while doing its business.
+// The growth factor is 1.5, rounding down, execpt for the initial x==1 case.
+template <typename T, typename Tlimit>
+inline T exponential_grow(const T & x, const Tlimit & limit) {
+	if (x <= 1) {
+		return 2;
+	}
+	T add = std::min(x >> 1, std::numeric_limits<T>::max() - x);
+	return std::min(x + add, mpt::saturate_cast<T>(limit));
+}
+
+template <typename T>
+inline T exponential_grow(const T & x) {
+	return mpt::exponential_grow(x, std::numeric_limits<T>::max());
+}
+
+
+// Check if val is in [lo,hi] without causing compiler warnings
+// if theses checks are always true due to the domain of T.
+// GCC does not warn if the type is templated.
+template <typename T, typename C>
+constexpr bool is_in_range(const T & val, const C & lo, const C & hi) {
+	return lo <= val && val <= hi;
+}
+
+
+template <typename Tcontainer, typename Tval>
+MPT_CONSTEXPR20_FUN bool contains(const Tcontainer & container, const Tval & value) noexcept(noexcept(std::find(std::begin(container), std::end(container), value))) {
+	return std::find(std::begin(container), std::end(container), value) != std::end(container);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALGORITHM_HPP

Property changes on: src/mpt/base/algorithm.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/alloc.hpp
===================================================================
--- src/mpt/base/alloc.hpp	(nonexistent)
+++ src/mpt/base/alloc.hpp	(working copy)
@@ -0,0 +1,157 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ALLOC_HPP
+#define MPT_BASE_ALLOC_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/span.hpp"
+
+#include <iterator>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T>
+inline mpt::span<T> as_span(std::vector<T> & cont) {
+	return mpt::span<T>(cont.data(), cont.data() + cont.size());
+}
+
+template <typename T>
+inline mpt::span<const T> as_span(const std::vector<T> & cont) {
+	return mpt::span<const T>(cont.data(), cont.data() + cont.size());
+}
+
+template <typename T>
+inline span<T> as_span(std::basic_string<T> & str) {
+	return span<T>(str.data(), str.size());
+}
+
+template <typename T>
+inline span<const T> as_span(const std::basic_string<T> & str) {
+	return span<const T>(str.data(), str.size());
+}
+
+
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T * beg, T * end) {
+	return std::vector<typename std::remove_const<T>::type>(beg, end);
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T * data, std::size_t size) {
+	return std::vector<typename std::remove_const<T>::type>(data, data + size);
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(mpt::span<T> data) {
+	return std::vector<typename std::remove_const<T>::type>(data.data(), data.data() + data.size());
+}
+
+template <typename T, std::size_t N>
+inline std::vector<typename std::remove_const<T>::type> make_vector(T (&arr)[N]) {
+	return std::vector<typename std::remove_const<T>::type>(std::begin(arr), std::end(arr));
+}
+
+template <typename T>
+inline std::vector<typename std::remove_const<T>::type> make_vector(const std::basic_string<T> & str) {
+	return std::vector<typename std::remove_const<T>::type>(str.begin(), str.end());
+}
+
+
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T * beg, T * end) {
+	return std::basic_string<typename std::remove_const<T>::type>(beg, end);
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T * data, std::size_t size) {
+	return std::basic_string<typename std::remove_const<T>::type>(data, data + size);
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(mpt::span<T> data) {
+	return std::basic_string<typename std::remove_const<T>::type>(data.data(), data.data() + data.size());
+}
+
+template <typename T, std::size_t N>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(T (&arr)[N]) {
+	return std::basic_string<typename std::remove_const<T>::type>(std::begin(arr), std::end(arr));
+}
+
+template <typename T>
+inline std::basic_string<typename std::remove_const<T>::type> make_basic_string(const std::vector<T> & str) {
+	return std::vector<typename std::remove_const<T>::type>(str.begin(), str.end());
+}
+
+
+
+template <typename Tcont2, typename Tcont1>
+inline Tcont1 & append(Tcont1 & cont1, const Tcont2 & cont2) {
+	cont1.insert(cont1.end(), cont2.begin(), cont2.end());
+	return cont1;
+}
+
+template <typename Tit2, typename Tcont1>
+inline Tcont1 & append(Tcont1 & cont1, Tit2 beg, Tit2 end) {
+	cont1.insert(cont1.end(), beg, end);
+	return cont1;
+}
+
+
+
+template <typename Tdst, typename Tsrc>
+struct buffer_cast_impl {
+	inline Tdst operator()(const Tsrc & src) const {
+		return Tdst(mpt::byte_cast<const typename Tdst::value_type *>(src.data()), mpt::byte_cast<const typename Tdst::value_type *>(src.data()) + src.size());
+	}
+};
+
+// casts between vector<->string of byte-castable types
+template <typename Tdst, typename Tsrc>
+inline Tdst buffer_cast(Tsrc src) {
+	return buffer_cast_impl<Tdst, Tsrc>()(src);
+}
+
+
+
+template <typename T>
+struct as_raw_memory_impl<std::vector<T>> {
+	inline mpt::const_byte_span operator()(const std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+	inline mpt::byte_span operator()(std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+};
+
+template <typename T>
+struct as_raw_memory_impl<const std::vector<T>> {
+	inline mpt::const_byte_span operator()(const std::vector<T> & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v.data()), v.size() * sizeof(T));
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALLOC_HPP

Property changes on: src/mpt/base/alloc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/arithmetic_shift.hpp
===================================================================
--- src/mpt/base/arithmetic_shift.hpp	(nonexistent)
+++ src/mpt/base/arithmetic_shift.hpp	(working copy)
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ARITHMETIC_SHIFT_HPP
+#define MPT_BASE_ARITHMETIC_SHIFT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/saturate_cast.hpp"
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// mpt::rshift_signed
+// mpt::lshift_signed
+// Shift a signed integer value in a well-defined manner.
+// Does the same thing as MSVC would do. This is verified by the test suite.
+
+template <typename T>
+constexpr auto rshift_signed_standard(T x, int y) noexcept -> decltype(x >> y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	using result_type = decltype(x >> y);
+	using unsigned_result_type = typename std::make_unsigned<result_type>::type;
+	const unsigned_result_type roffset = static_cast<unsigned_result_type>(1) << ((sizeof(result_type) * 8) - 1);
+	result_type rx = x;
+	unsigned_result_type urx = static_cast<unsigned_result_type>(rx);
+	urx += roffset;
+	urx >>= y;
+	urx -= roffset >> y;
+	return static_cast<result_type>(urx);
+}
+
+template <typename T>
+constexpr auto lshift_signed_standard(T x, int y) noexcept -> decltype(x << y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	using result_type = decltype(x << y);
+	using unsigned_result_type = typename std::make_unsigned<result_type>::type;
+	const unsigned_result_type roffset = static_cast<unsigned_result_type>(1) << ((sizeof(result_type) * 8) - 1);
+	result_type rx = x;
+	unsigned_result_type urx = static_cast<unsigned_result_type>(rx);
+	urx += roffset;
+	urx <<= y;
+	urx -= roffset << y;
+	return static_cast<result_type>(urx);
+}
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+template <typename T>
+constexpr auto rshift_signed_undefined(T x, int y) noexcept -> decltype(x >> y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	return x >> y;
+}
+
+template <typename T>
+constexpr auto lshift_signed_undefined(T x, int y) noexcept -> decltype(x << y) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::numeric_limits<T>::is_signed);
+	return x << y;
+}
+
+template <typename T>
+constexpr auto rshift_signed(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed_undefined(x, y);
+}
+
+template <typename T>
+constexpr auto lshift_signed(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed_undefined(x, y);
+}
+
+#else
+
+template <typename T>
+constexpr auto rshift_signed(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed_standard(x, y);
+}
+
+template <typename T>
+constexpr auto lshift_signed(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed_standard(x, y);
+}
+
+#endif
+
+template <typename T>
+constexpr auto arithmetic_shift_right(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto arithmetic_shift_right(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto sar(T x, int y) noexcept -> decltype(x >> y) {
+	return mpt::rshift_signed(x, y);
+}
+
+template <typename T>
+constexpr auto sal(T x, int y) noexcept -> decltype(x << y) {
+	return mpt::lshift_signed(x, y);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ARITHMETIC_SHIFT_HPP

Property changes on: src/mpt/base/arithmetic_shift.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/array.hpp
===================================================================
--- src/mpt/base/array.hpp	(nonexistent)
+++ src/mpt/base/array.hpp	(working copy)
@@ -0,0 +1,82 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_ARRAY_HPP
+#define MPT_BASE_ARRAY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename T>
+struct stdarray_extent : std::integral_constant<std::size_t, 0> { };
+
+template <typename T, std::size_t N>
+struct stdarray_extent<std::array<T, N>> : std::integral_constant<std::size_t, N> { };
+
+template <typename T>
+struct is_stdarray : std::false_type { };
+
+template <typename T, std::size_t N>
+struct is_stdarray<std::array<T, N>> : std::true_type { };
+
+// mpt::extent is the same as std::extent,
+// but also works for std::array,
+// and asserts that the given type is actually an array type instead of returning 0.
+// use as:
+// mpt::extent<decltype(expr)>()
+// mpt::extent<decltype(variable)>()
+// mpt::extent<decltype(type)>()
+// mpt::extent<type>()
+template <typename T>
+constexpr std::size_t extent() noexcept {
+	using Tarray = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
+	static_assert(std::is_array<Tarray>::value || mpt::is_stdarray<Tarray>::value);
+	if constexpr (mpt::is_stdarray<Tarray>::value) {
+		return mpt::stdarray_extent<Tarray>();
+	} else {
+		return std::extent<Tarray>();
+	}
+}
+
+template <typename>
+struct array_size;
+
+template <typename T, std::size_t N>
+struct array_size<std::array<T, N>> {
+	static constexpr std::size_t size = N;
+};
+
+template <typename T, std::size_t N>
+struct array_size<T[N]> {
+	static constexpr std::size_t size = N;
+};
+
+
+template <typename T, std::size_t N, typename Tx>
+constexpr std::array<T, N> init_array(const Tx & x) {
+	std::array<T, N> result{};
+	for (std::size_t i = 0; i < N; ++i) {
+		result[i] = x;
+	}
+	return result;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ARRAY_HPP

Property changes on: src/mpt/base/array.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/bit.hpp
===================================================================
--- src/mpt/base/bit.hpp	(nonexistent)
+++ src/mpt/base/bit.hpp	(working copy)
@@ -0,0 +1,392 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_BIT_HPP
+#define MPT_BASE_BIT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/macros.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <bit>
+#else // !C++20
+#include <array>
+#include <limits>
+#endif // C++20
+#include <type_traits>
+
+#include <cstddef>
+#if MPT_CXX_BEFORE(20)
+#include <cstring>
+#endif // !C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+using std::bit_cast;
+#else
+// C++2a compatible bit_cast.
+// Not implementing constexpr because this is not easily possible pre C++20.
+template <typename Tdst, typename Tsrc>
+MPT_FORCEINLINE typename std::enable_if<(sizeof(Tdst) == sizeof(Tsrc)) && std::is_trivially_copyable<Tsrc>::value && std::is_trivially_copyable<Tdst>::value, Tdst>::type bit_cast(const Tsrc & src) noexcept {
+	Tdst dst{};
+	std::memcpy(&dst, &src, sizeof(Tdst));
+	return dst;
+}
+#endif
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::endian;
+
+static_assert(mpt::endian::big != mpt::endian::little, "platform with all scalar types having size 1 is not supported");
+
+constexpr mpt::endian get_endian() noexcept {
+	return mpt::endian::native;
+}
+
+constexpr bool endian_is_little() noexcept {
+	return get_endian() == mpt::endian::little;
+}
+
+constexpr bool endian_is_big() noexcept {
+	return get_endian() == mpt::endian::big;
+}
+
+constexpr bool endian_is_weird() noexcept {
+	return !endian_is_little() && !endian_is_big();
+}
+
+#else // !C++20
+
+#if !MPT_COMPILER_GENERIC
+
+#if MPT_COMPILER_MSVC
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#endif
+#endif
+
+// fallback:
+#if !defined(MPT_PLATFORM_BIG_ENDIAN) && !defined(MPT_PLATFORM_LITTLE_ENDIAN)
+// taken from boost/detail/endian.hpp
+#if (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) \
+	|| (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) \
+	|| (defined(_STLP_BIG_ENDIAN) && !defined(_STLP_LITTLE_ENDIAN))
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) \
+	|| (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) \
+	|| (defined(_STLP_LITTLE_ENDIAN) && !defined(_STLP_BIG_ENDIAN))
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#elif defined(__sparc) || defined(__sparc__) \
+	|| defined(_POWER) || defined(__powerpc__) \
+	|| defined(__ppc__) || defined(__hpux) || defined(__hppa) \
+	|| defined(_MIPSEB) || defined(_POWER) \
+	|| defined(__s390__)
+#define MPT_PLATFORM_BIG_ENDIAN
+#elif defined(__i386__) || defined(__alpha__) \
+	|| defined(__ia64) || defined(__ia64__) \
+	|| defined(_M_IX86) || defined(_M_IA64) \
+	|| defined(_M_ALPHA) || defined(__amd64) \
+	|| defined(__amd64__) || defined(_M_AMD64) \
+	|| defined(__x86_64) || defined(__x86_64__) \
+	|| defined(_M_X64) || defined(__bfin__)
+#define MPT_PLATFORM_LITTLE_ENDIAN
+#endif
+#endif
+
+#endif // !MPT_COMPILER_GENERIC
+
+enum class endian
+{
+	little = 0x78563412u,
+	big = 0x12345678u,
+	weird = 1u,
+#if MPT_COMPILER_GENERIC
+	native = 0u,
+#elif defined(MPT_PLATFORM_LITTLE_ENDIAN)
+	native = little,
+#elif defined(MPT_PLATFORM_BIG_ENDIAN)
+	native = big,
+#else
+	native = 0u,
+#endif
+};
+
+static_assert(mpt::endian::big != mpt::endian::little, "platform with all scalar types having size 1 is not supported");
+
+MPT_FORCEINLINE mpt::endian endian_probe() noexcept {
+	using endian_probe_type = uint32;
+	static_assert(sizeof(endian_probe_type) == 4);
+	constexpr endian_probe_type endian_probe_big = 0x12345678u;
+	constexpr endian_probe_type endian_probe_little = 0x78563412u;
+	const std::array<std::byte, sizeof(endian_probe_type)> probe{{std::byte{0x12}, std::byte{0x34}, std::byte{0x56}, std::byte{0x78}}};
+	const endian_probe_type test = mpt::bit_cast<endian_probe_type>(probe);
+	mpt::endian result = mpt::endian::native;
+	switch (test) {
+		case endian_probe_big:
+			result = mpt::endian::big;
+			break;
+		case endian_probe_little:
+			result = mpt::endian::little;
+			break;
+		default:
+			result = mpt::endian::weird;
+			break;
+	}
+	return result;
+}
+
+MPT_FORCEINLINE mpt::endian get_endian() noexcept {
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 6285) // false-positive: (<non-zero constant> || <non-zero constant>) is always a non-zero constant.
+#endif                          // MPT_COMPILER_MSVC
+	if constexpr ((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+		return mpt::endian::native;
+	} else {
+		return mpt::endian_probe();
+	}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+}
+
+MPT_FORCEINLINE bool endian_is_little() noexcept {
+	return get_endian() == mpt::endian::little;
+}
+
+MPT_FORCEINLINE bool endian_is_big() noexcept {
+	return get_endian() == mpt::endian::big;
+}
+
+MPT_FORCEINLINE bool endian_is_weird() noexcept {
+	return !endian_is_little() && !endian_is_big();
+}
+
+#endif // C++20
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::bit_ceil;
+using std::bit_floor;
+using std::bit_width;
+using std::countl_one;
+using std::countl_zero;
+using std::countr_one;
+using std::countr_zero;
+using std::has_single_bit;
+using std::popcount;
+using std::rotl;
+using std::rotr;
+
+#else // !C++20
+
+// C++20 <bit> header.
+// Note that we do not use SFINAE here but instead rely on static_assert.
+
+template <typename T>
+constexpr int popcount(T val) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int result = 0;
+	while (val > 0) {
+		if (val & 0x1) {
+			result++;
+		}
+		val >>= 1;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr bool has_single_bit(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	return mpt::popcount(x) == 1;
+}
+
+template <typename T>
+constexpr T bit_ceil(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	T result = 1;
+	while (result < x) {
+		T newresult = result << 1;
+		if (newresult < result) {
+			return 0;
+		}
+		result = newresult;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr T bit_floor(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	if (x == 0) {
+		return 0;
+	}
+	T result = 1;
+	do {
+		T newresult = result << 1;
+		if (newresult < result) {
+			return result;
+		}
+		result = newresult;
+	} while (result <= x);
+	return result >> 1;
+}
+
+template <typename T>
+constexpr T bit_width(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	T result = 0;
+	while (x > 0) {
+		x >>= 1;
+		result += 1;
+	}
+	return result;
+}
+
+template <typename T>
+constexpr int countl_zero(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = std::numeric_limits<T>::digits - 1; bit >= 0; --bit) {
+		if ((x & (1u << bit)) == 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countl_one(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = std::numeric_limits<T>::digits - 1; bit >= 0; --bit) {
+		if ((x & (1u << bit)) != 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countr_zero(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = 0; bit < std::numeric_limits<T>::digits; ++bit) {
+		if ((x & (1u << bit)) == 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr int countr_one(T x) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	int count = 0;
+	for (int bit = 0; bit < std::numeric_limits<T>::digits; ++bit) {
+		if ((x & (1u << bit)) != 0u) {
+			count++;
+		} else {
+			break;
+		}
+	}
+	return count;
+}
+
+template <typename T>
+constexpr T rotl_impl(T x, int r) noexcept {
+	auto N = std::numeric_limits<T>::digits;
+	return (x >> (N - r)) | (x << r);
+}
+
+template <typename T>
+constexpr T rotr_impl(T x, int r) noexcept {
+	auto N = std::numeric_limits<T>::digits;
+	return (x << (N - r)) | (x >> r);
+}
+
+template <typename T>
+constexpr T rotl(T x, int s) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	auto N = std::numeric_limits<T>::digits;
+	auto r = s % N;
+	return (s < 0) ? mpt::rotr_impl(x, -s) : ((x >> (N - r)) | (x << r));
+}
+
+template <typename T>
+constexpr T rotr(T x, int s) noexcept {
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(std::is_unsigned<T>::value);
+	auto N = std::numeric_limits<T>::digits;
+	auto r = s % N;
+	return (s < 0) ? mpt::rotl_impl(x, -s) : ((x << (N - r)) | (x >> r));
+}
+
+#endif // C++20
+
+
+
+template <typename T>
+constexpr int lower_bound_entropy_bits(T x_) {
+	typename std::make_unsigned<T>::type x = static_cast<typename std::make_unsigned<T>::type>(x_);
+	return mpt::bit_width(x) == static_cast<typename std::make_unsigned<T>::type>(mpt::popcount(x)) ? mpt::bit_width(x) : mpt::bit_width(x) - 1;
+}
+
+
+template <typename T>
+constexpr bool is_mask(T x) {
+	static_assert(std::is_integral<T>::value);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	unsigned_T ux = static_cast<unsigned_T>(x);
+	unsigned_T mask = 0;
+	for (std::size_t bits = 0; bits <= (sizeof(unsigned_T) * 8); ++bits) {
+		mask = (mask << 1) | 1u;
+		if (ux == mask) {
+			return true;
+		}
+	}
+	return false;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_BIT_HPP

Property changes on: src/mpt/base/bit.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/check_platform.hpp
===================================================================
--- src/mpt/base/check_platform.hpp	(nonexistent)
+++ src/mpt/base/check_platform.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_CHECK_PLATFORM_HPP
+#define MPT_BASE_CHECK_PLATFORM_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/pointer.hpp"
+
+#include <limits>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+static_assert(sizeof(std::uintptr_t) == sizeof(void *));
+static_assert(std::numeric_limits<unsigned char>::digits == 8);
+
+static_assert(sizeof(char) == 1);
+
+static_assert(sizeof(std::byte) == 1);
+static_assert(alignof(std::byte) == 1);
+
+static_assert(mpt::arch_bits == static_cast<int>(mpt::pointer_size) * 8);
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_CHECK_PLATFORM_HPP

Property changes on: src/mpt/base/check_platform.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/compiletime_warning.hpp
===================================================================
--- src/mpt/base/compiletime_warning.hpp	(nonexistent)
+++ src/mpt/base/compiletime_warning.hpp	(working copy)
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_COMPILETIME_WARNING_HPP
+#define MPT_BASE_COMPILETIME_WARNING_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/preprocessor.hpp"
+
+
+
+#if MPT_COMPILER_MSVC
+
+#define MPT_WARNING(text)           __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
+#define MPT_WARNING_STATEMENT(text) __pragma(message(__FILE__ "(" MPT_PP_DEFER(MPT_PP_STRINGIFY, __LINE__) "): Warning: " text))
+
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+
+#define MPT_WARNING(text)           _Pragma(MPT_PP_STRINGIFY(GCC warning text))
+#define MPT_WARNING_STATEMENT(text) _Pragma(MPT_PP_STRINGIFY(GCC warning text))
+
+#else
+
+// portable #pragma message or #warning replacement
+#define MPT_WARNING(text) \
+	static inline int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME)() noexcept { \
+		int warning [[deprecated("Warning: " text)]] = 0; \
+		return warning; \
+	} \
+/**/
+#define MPT_WARNING_STATEMENT(text) \
+	int MPT_PP_UNIQUE_IDENTIFIER(MPT_WARNING_NAME) = []() { \
+		int warning [[deprecated("Warning: " text)]] = 0; \
+		return warning; \
+	}() /**/
+
+#endif
+
+
+
+#endif // MPT_BASE_COMPILETIME_WARNING_HPP

Property changes on: src/mpt/base/compiletime_warning.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/constexpr_throw.hpp
===================================================================
--- src/mpt/base/constexpr_throw.hpp	(nonexistent)
+++ src/mpt/base/constexpr_throw.hpp	(working copy)
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_CONSTEXPR_THROW_HPP
+#define MPT_BASE_CONSTEXPR_THROW_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Work-around for the requirement of at least 1 non-throwing function argument combination in C++ (17,2a).
+
+template <typename Exception>
+constexpr bool constexpr_throw_helper(Exception && e, bool really = true) {
+	//return !really ? really : throw std::forward<Exception>(e);
+	if (really) {
+		throw std::forward<Exception>(e);
+	}
+	// cppcheck-suppress identicalConditionAfterEarlyExit
+	return really;
+}
+
+template <typename Exception>
+constexpr bool constexpr_throw(Exception && e) {
+	return mpt::constexpr_throw_helper(std::forward<Exception>(e));
+}
+
+template <typename T, typename Exception>
+constexpr T constexpr_throw_helper(Exception && e, bool really = true) {
+	//return !really ? really : throw std::forward<Exception>(e);
+	if (really) {
+		throw std::forward<Exception>(e);
+	}
+	return T{};
+}
+
+template <typename T, typename Exception>
+constexpr T constexpr_throw(Exception && e) {
+	return mpt::constexpr_throw_helper<T>(std::forward<Exception>(e));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_CONSTEXPR_THROW_HPP

Property changes on: src/mpt/base/constexpr_throw.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect.hpp
===================================================================
--- src/mpt/base/detect.hpp	(nonexistent)
+++ src/mpt/base/detect.hpp	(working copy)
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_HPP
+#define MPT_BASE_DETECT_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+#include "mpt/base/detect_libcxx.hpp"
+#include "mpt/base/detect_libc.hpp"
+
+
+
+#endif // MPT_BASE_DETECT_HPP

Property changes on: src/mpt/base/detect.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_compiler.hpp
===================================================================
--- src/mpt/base/detect_compiler.hpp	(nonexistent)
+++ src/mpt/base/detect_compiler.hpp	(working copy)
@@ -0,0 +1,170 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_COMPILER_HPP
+#define MPT_BASE_DETECT_COMPILER_HPP
+
+
+
+#define MPT_COMPILER_MAKE_VERSION2(version, sp)         ((version)*100 + (sp))
+#define MPT_COMPILER_MAKE_VERSION3(major, minor, patch) ((major)*10000 + (minor)*100 + (patch))
+
+
+
+#if defined(MPT_COMPILER_GENERIC)
+
+#undef MPT_COMPILER_GENERIC
+#define MPT_COMPILER_GENERIC 1
+
+#elif defined(__clang__) && defined(_MSC_VER) && defined(__c2__)
+
+#error "Clang/C2 is not supported. Please use Clang/LLVM for Windows instead."
+
+#elif defined(__clang__)
+
+#define MPT_COMPILER_CLANG                      1
+#define MPT_COMPILER_CLANG_VERSION              MPT_COMPILER_MAKE_VERSION3(__clang_major__, __clang_minor__, __clang_patchlevel__)
+#define MPT_CLANG_AT_LEAST(major, minor, patch) (MPT_COMPILER_CLANG_VERSION >= MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+#define MPT_CLANG_BEFORE(major, minor, patch)   (MPT_COMPILER_CLANG_VERSION < MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+
+#if MPT_CLANG_BEFORE(7, 0, 0)
+#error "clang version 7 required"
+#endif
+
+#if defined(__clang_analyzer__)
+#ifndef MPT_BUILD_ANALYZED
+#define MPT_BUILD_ANALYZED
+#endif
+#endif
+
+#elif defined(__GNUC__)
+
+#define MPT_COMPILER_GCC                      1
+#define MPT_COMPILER_GCC_VERSION              MPT_COMPILER_MAKE_VERSION3(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+#define MPT_GCC_AT_LEAST(major, minor, patch) (MPT_COMPILER_GCC_VERSION >= MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+#define MPT_GCC_BEFORE(major, minor, patch)   (MPT_COMPILER_GCC_VERSION < MPT_COMPILER_MAKE_VERSION3((major), (minor), (patch)))
+
+#if MPT_GCC_BEFORE(8, 1, 0)
+#error "GCC version 8.1 required"
+#endif
+
+#elif defined(_MSC_VER)
+
+#define MPT_COMPILER_MSVC 1
+#if (_MSC_VER >= 1926)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 6)
+#elif (_MSC_VER >= 1925)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 5)
+#elif (_MSC_VER >= 1924)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 4)
+#elif (_MSC_VER >= 1923)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 3)
+#elif (_MSC_VER >= 1922)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 2)
+#elif (_MSC_VER >= 1921)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 1)
+#elif (_MSC_VER >= 1920)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2019, 0)
+#elif (_MSC_VER >= 1916)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 9)
+#elif (_MSC_VER >= 1915)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 8)
+#elif (_MSC_VER >= 1914)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 7)
+#elif (_MSC_VER >= 1913)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 6)
+#elif (_MSC_VER >= 1912)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 5)
+#elif (_MSC_VER >= 1911)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 3)
+#elif (_MSC_VER >= 1910)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2017, 0)
+#elif (_MSC_VER >= 1900) && defined(_MSVC_LANG)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2015, 3)
+#elif (_MSC_VER >= 1900)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2015, 0)
+#elif (_MSC_VER >= 1800)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2013, 0)
+#elif (_MSC_VER >= 1700)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2012, 0)
+#elif (_MSC_VER >= 1600)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2010, 0)
+#elif (_MSC_VER >= 1500)
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2008, 0)
+#else
+#define MPT_COMPILER_MSVC_VERSION MPT_COMPILER_MAKE_VERSION2(2005, 0)
+#endif
+#define MPT_MSVC_AT_LEAST(version, sp) (MPT_COMPILER_MSVC_VERSION >= MPT_COMPILER_MAKE_VERSION2((version), (sp)))
+#define MPT_MSVC_BEFORE(version, sp)   (MPT_COMPILER_MSVC_VERSION < MPT_COMPILER_MAKE_VERSION2((version), (sp)))
+
+#if MPT_MSVC_BEFORE(2017, 9)
+#error "MSVC version 2017 15.9 required"
+#endif
+
+#if defined(_PREFAST_)
+#ifndef MPT_BUILD_ANALYZED
+#define MPT_BUILD_ANALYZED
+#endif
+#endif
+
+#else
+
+#define MPT_COMPILER_GENERIC 1
+
+#endif
+
+
+
+#ifndef MPT_COMPILER_GENERIC
+#define MPT_COMPILER_GENERIC 0
+#endif
+#ifndef MPT_COMPILER_CLANG
+#define MPT_COMPILER_CLANG                      0
+#define MPT_CLANG_AT_LEAST(major, minor, patch) 0
+#define MPT_CLANG_BEFORE(major, minor, patch)   0
+#endif
+#ifndef MPT_COMPILER_GCC
+#define MPT_COMPILER_GCC                      0
+#define MPT_GCC_AT_LEAST(major, minor, patch) 0
+#define MPT_GCC_BEFORE(major, minor, patch)   0
+#endif
+#ifndef MPT_COMPILER_MSVC
+#define MPT_COMPILER_MSVC              0
+#define MPT_MSVC_AT_LEAST(version, sp) 0
+#define MPT_MSVC_BEFORE(version, sp)   0
+#endif
+
+
+
+#if MPT_COMPILER_GENERIC || MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+
+#if (__cplusplus >= 201703)
+#define MPT_CXX 17
+#else
+#define MPT_CXX 17
+#endif
+
+#elif MPT_COMPILER_MSVC
+
+#if (_MSVC_LANG >= 201703)
+#define MPT_CXX 17
+#else
+#define MPT_CXX 17
+#endif
+
+#else
+
+#define MPT_CXX 17
+
+#endif
+
+// MPT_CXX is stricter than just using __cplusplus directly.
+// We will only claim a language version as supported IFF all core language and
+// library fatures that we need are actually supported AND working correctly
+// (to our needs).
+
+#define MPT_CXX_AT_LEAST(version) (MPT_CXX >= (version))
+#define MPT_CXX_BEFORE(version)   (MPT_CXX < (version))
+
+
+
+#endif // MPT_BASE_DETECT_COMPILER_HPP

Property changes on: src/mpt/base/detect_compiler.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_libc.hpp
===================================================================
--- src/mpt/base/detect_libc.hpp	(nonexistent)
+++ src/mpt/base/detect_libc.hpp	(working copy)
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_LIBC_HPP
+#define MPT_BASE_DETECT_LIBC_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+
+#include <cstddef>
+
+
+
+// order of checks is important!
+#if MPT_COMPILER_GENERIC
+#define MPT_LIBC_GENERIC 1
+#elif MPT_COMPILER_GCC && (defined(__MINGW32__) || defined(__MINGW64__))
+#define MPT_LIBC_MS 1
+#elif defined(__GNU_LIBRARY__)
+#define MPT_LIBC_GLIBC 1
+#elif MPT_COMPILER_MSVC
+#define MPT_LIBC_MS 1
+#elif MPT_COMPILER_CLANG && MPT_OS_WINDOWS
+#define MPT_LIBC_MS 1
+#else
+#define MPT_LIBC_GENERIC 1
+#endif
+
+#ifndef MPT_LIBC_GENERIC
+#define MPT_LIBC_GENERIC 0
+#endif
+#ifndef MPT_LIBC_GLIBC
+#define MPT_LIBC_GLIBC 0
+#endif
+#ifndef MPT_LIBC_MS
+#define MPT_LIBC_MS 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_LIBC_HPP

Property changes on: src/mpt/base/detect_libc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_libcxx.hpp
===================================================================
--- src/mpt/base/detect_libcxx.hpp	(nonexistent)
+++ src/mpt/base/detect_libcxx.hpp	(working copy)
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_LIBCXX_HPP
+#define MPT_BASE_DETECT_LIBCXX_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/detect_quirks.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <version>
+#else // !C++20
+#include <array>
+#endif // C++20
+
+
+
+// order of checks is important!
+#if MPT_COMPILER_GENERIC
+#define MPT_LIBCXX_GENERIC 1
+#elif defined(_LIBCPP_VERSION)
+#define MPT_LIBCXX_LLVM 1
+#elif defined(__GLIBCXX__) || defined(__GLIBCPP__)
+#define MPT_LIBCXX_GNU 1
+#elif MPT_COMPILER_MSVC
+#define MPT_LIBCXX_MS 1
+#elif MPT_COMPILER_CLANG && MPT_OS_WINDOWS
+#define MPT_LIBCXX_MS 1
+#else
+#define MPT_LIBCXX_GENERIC 1
+#endif
+
+#ifndef MPT_LIBCXX_GENERIC
+#define MPT_LIBCXX_GENERIC 0
+#endif
+#ifndef MPT_LIBCXX_LLVM
+#define MPT_LIBCXX_LLVM 0
+#endif
+#ifndef MPT_LIBCXX_GNU
+#define MPT_LIBCXX_GNU 0
+#endif
+#ifndef MPT_LIBCXX_MS
+#define MPT_LIBCXX_MS 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_LIBCXX_HPP

Property changes on: src/mpt/base/detect_libcxx.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_os.hpp
===================================================================
--- src/mpt/base/detect_os.hpp	(nonexistent)
+++ src/mpt/base/detect_os.hpp	(working copy)
@@ -0,0 +1,109 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_OS_HPP
+#define MPT_BASE_DETECT_OS_HPP
+
+
+
+// The order of the checks matters!
+#if defined(__DJGPP__)
+#define MPT_OS_DJGPP 1
+#elif defined(__EMSCRIPTEN__)
+#define MPT_OS_EMSCRIPTEN 1
+#if defined(__EMSCRIPTEN_major__) && defined(__EMSCRIPTEN_minor__)
+#if (__EMSCRIPTEN_major__ > 1)
+// ok
+#elif (__EMSCRIPTEN_major__ == 1) && (__EMSCRIPTEN_minor__ > 39)
+// ok
+#elif (__EMSCRIPTEN_major__ == 1) && (__EMSCRIPTEN_minor__ == 39) && (__EMSCRIPTEN_tiny__ >= 7)
+// ok
+#else
+#error "Emscripten >= 1.39.7 is required."
+#endif
+#endif
+#elif defined(_WIN32)
+#define MPT_OS_WINDOWS 1
+#if defined(WINAPI_FAMILY)
+#include <winapifamily.h>
+#if (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
+#define MPT_OS_WINDOWS_WINRT 0
+#else
+#define MPT_OS_WINDOWS_WINRT 1
+#endif
+#else // !WINAPI_FAMILY
+#define MPT_OS_WINDOWS_WINRT 0
+#endif // WINAPI_FAMILY
+#elif defined(__APPLE__)
+#define MPT_OS_MACOSX_OR_IOS 1
+//#include "TargetConditionals.h"
+//#if TARGET_IPHONE_SIMULATOR
+//#elif TARGET_OS_IPHONE
+//#elif TARGET_OS_MAC
+//#else
+//#endif
+#elif defined(__HAIKU__)
+#define MPT_OS_HAIKU 1
+#elif defined(__ANDROID__) || defined(ANDROID)
+#define MPT_OS_ANDROID 1
+#elif defined(__linux__)
+#define MPT_OS_LINUX 1
+#elif defined(__DragonFly__)
+#define MPT_OS_DRAGONFLYBSD 1
+#elif defined(__FreeBSD__)
+#define MPT_OS_FREEBSD 1
+#elif defined(__OpenBSD__)
+#define MPT_OS_OPENBSD 1
+#elif defined(__NetBSD__)
+#define MPT_OS_NETBSD 1
+#elif defined(__unix__)
+#define MPT_OS_GENERIC_UNIX 1
+#else
+#define MPT_OS_UNKNOWN 1
+#endif
+
+#ifndef MPT_OS_DJGPP
+#define MPT_OS_DJGPP 0
+#endif
+#ifndef MPT_OS_EMSCRIPTEN
+#define MPT_OS_EMSCRIPTEN 0
+#endif
+#ifndef MPT_OS_WINDOWS
+#define MPT_OS_WINDOWS 0
+#endif
+#ifndef MPT_OS_WINDOWS_WINRT
+#define MPT_OS_WINDOWS_WINRT 0
+#endif
+#ifndef MPT_OS_MACOSX_OR_IOS
+#define MPT_OS_MACOSX_OR_IOS 0
+#endif
+#ifndef MPT_OS_HAIKU
+#define MPT_OS_HAIKU 0
+#endif
+#ifndef MPT_OS_ANDROID
+#define MPT_OS_ANDROID 0
+#endif
+#ifndef MPT_OS_LINUX
+#define MPT_OS_LINUX 0
+#endif
+#ifndef MPT_OS_DRAGONFLYBSD
+#define MPT_OS_DRAGONFLYBSD 0
+#endif
+#ifndef MPT_OS_FREEBSD
+#define MPT_OS_FREEBSD 0
+#endif
+#ifndef MPT_OS_OPENBSD
+#define MPT_OS_OPENBSD 0
+#endif
+#ifndef MPT_OS_NETBSD
+#define MPT_OS_NETBSD 0
+#endif
+#ifndef MPT_OS_GENERIC_UNIX
+#define MPT_OS_GENERIC_UNIX 0
+#endif
+#ifndef MPT_OS_UNKNOWN
+#define MPT_OS_UNKNOWN 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_OS.hpp

Property changes on: src/mpt/base/detect_os.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/detect_quirks.hpp
===================================================================
--- src/mpt/base/detect_quirks.hpp	(nonexistent)
+++ src/mpt/base/detect_quirks.hpp	(working copy)
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_DETECT_QUIRKS_HPP
+#define MPT_BASE_DETECT_QUIRKS_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/detect_os.hpp"
+
+
+
+#if MPT_COMPILER_MSVC
+// Compiler has multiplication/division semantics when shifting signed integers.
+#define MPT_COMPILER_SHIFT_SIGNED 1
+#endif
+
+#ifndef MPT_COMPILER_SHIFT_SIGNED
+#define MPT_COMPILER_SHIFT_SIGNED 0
+#endif
+
+
+
+// This should really be based on __STDCPP_THREADS__, but that is not defined by
+// GCC or clang. Stupid.
+// Just assume multithreaded and disable for platforms we know are
+// singlethreaded later on.
+#define MPT_PLATFORM_MULTITHREADED 1
+
+#if MPT_OS_DJGPP
+#undef MPT_PLATFORM_MULTITHREADED
+#define MPT_PLATFORM_MULTITHREADED 0
+#endif
+
+#if (MPT_OS_EMSCRIPTEN && !defined(__EMSCRIPTEN_PTHREADS__))
+#undef MPT_PLATFORM_MULTITHREADED
+#define MPT_PLATFORM_MULTITHREADED 0
+#endif
+
+
+
+#if MPT_OS_EMSCRIPTEN && defined(MPT_BUILD_AUDIOWORKLETPROCESSOR)
+#define MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK
+#endif
+
+
+
+#if MPT_OS_EMSCRIPTEN && defined(MPT_BUILD_AUDIOWORKLETPROCESSOR)
+#define MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+#endif
+
+
+
+#if MPT_OS_DJGPP
+#define MPT_COMPILER_QUIRK_NO_WCHAR
+#endif
+
+
+
+#if defined(__arm__)
+
+#if defined(__SOFTFP__)
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 1
+#else
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+#if defined(__VFP_FP__)
+// native-endian IEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 0
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      0
+#elif defined(__MAVERICK__)
+// little-endian IEEE754, we assume native-endian though
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 1
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      0
+#else
+// not IEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 1
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754      1
+#endif
+
+#elif defined(__mips__)
+
+#if defined(__mips_soft_float)
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 1
+#else
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+
+#endif
+
+#if MPT_OS_EMSCRIPTEN
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER64 1
+#endif
+
+#ifndef MPT_COMPILER_QUIRK_FLOAT_PREFER32
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER32 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_PREFER64
+#define MPT_COMPILER_QUIRK_FLOAT_PREFER64 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_EMULATED
+#define MPT_COMPILER_QUIRK_FLOAT_EMULATED 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN
+#define MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN 0
+#endif
+#ifndef MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754
+#define MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754 0
+#endif
+
+
+
+#endif // MPT_BASE_DETECT_QUIRKS_HPP

Property changes on: src/mpt/base/detect_quirks.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/floatingpoint.hpp
===================================================================
--- src/mpt/base/floatingpoint.hpp	(nonexistent)
+++ src/mpt/base/floatingpoint.hpp	(working copy)
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_FLOATINGPOINT_HPP
+#define MPT_BASE_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// fp half
+// n/a
+
+// fp single
+using single = float;
+namespace float_literals {
+constexpr single operator"" _fs(long double lit) noexcept {
+	return static_cast<single>(lit);
+}
+} // namespace float_literals
+
+// fp double
+namespace float_literals {
+constexpr double operator"" _fd(long double lit) noexcept {
+	return static_cast<double>(lit);
+}
+} // namespace float_literals
+
+// fp extended
+namespace float_literals {
+constexpr long double operator"" _fe(long double lit) noexcept {
+	return static_cast<long double>(lit);
+}
+} // namespace float_literals
+
+// fp quad
+// n/a
+
+using float32 = std::conditional<sizeof(float) == 4, float, std::conditional<sizeof(double) == 4, double, std::conditional<sizeof(long double) == 4, long double, float>::type>::type>::type;
+namespace float_literals {
+constexpr float32 operator"" _f32(long double lit) noexcept {
+	return static_cast<float32>(lit);
+}
+} // namespace float_literals
+
+using float64 = std::conditional<sizeof(float) == 8, float, std::conditional<sizeof(double) == 8, double, std::conditional<sizeof(long double) == 8, long double, double>::type>::type>::type;
+namespace float_literals {
+constexpr float64 operator"" _f64(long double lit) noexcept {
+	return static_cast<float64>(lit);
+}
+} // namespace float_literals
+
+template <typename T>
+struct float_traits {
+	static constexpr bool is_float = !std::numeric_limits<T>::is_integer;
+	static constexpr bool is_hard = is_float && !MPT_COMPILER_QUIRK_FLOAT_EMULATED;
+	static constexpr bool is_soft = is_float && MPT_COMPILER_QUIRK_FLOAT_EMULATED;
+	static constexpr bool is_float32 = is_float && (sizeof(T) == 4);
+	static constexpr bool is_float64 = is_float && (sizeof(T) == 8);
+	static constexpr bool is_native_endian = is_float && !MPT_COMPILER_QUIRK_FLOAT_NOTNATIVEENDIAN;
+	static constexpr bool is_ieee754_binary = is_float && std::numeric_limits<T>::is_iec559 && !MPT_COMPILER_QUIRK_FLOAT_NOTIEEE754;
+	static constexpr bool is_ieee754_binary32 = is_float && is_ieee754_binary && is_float32;
+	static constexpr bool is_ieee754_binary64 = is_float && is_ieee754_binary && is_float64;
+	static constexpr bool is_ieee754_binary32ne = is_float && is_ieee754_binary && is_float32 && is_native_endian;
+	static constexpr bool is_ieee754_binary64ne = is_float && is_ieee754_binary && is_float64 && is_native_endian;
+	static constexpr bool is_preferred = is_float && ((is_float32 && MPT_COMPILER_QUIRK_FLOAT_PREFER32) || (is_float64 && MPT_COMPILER_QUIRK_FLOAT_PREFER64));
+};
+
+// prefer smaller floats, but try to use IEEE754 floats
+using nativefloat =
+	std::conditional<mpt::float_traits<float32>::is_preferred, float32, std::conditional<mpt::float_traits<float64>::is_preferred, float64, std::conditional<std::numeric_limits<float>::is_iec559, float, std::conditional<std::numeric_limits<double>::is_iec559, double, std::conditional<std::numeric_limits<long double>::is_iec559, long double, float>::type>::type>::type>::type>::type;
+namespace float_literals {
+constexpr nativefloat operator"" _nf(long double lit) noexcept {
+	return static_cast<nativefloat>(lit);
+}
+} // namespace float_literals
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_FLOATINGPOINT_HPP

Property changes on: src/mpt/base/floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/integer.hpp
===================================================================
--- src/mpt/base/integer.hpp	(nonexistent)
+++ src/mpt/base/integer.hpp	(working copy)
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_INTEGER_HPP
+#define MPT_BASE_INTEGER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <cstdint>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+using int8 = std::int8_t;
+using int16 = std::int16_t;
+using int32 = std::int32_t;
+using int64 = std::int64_t;
+using uint8 = std::uint8_t;
+using uint16 = std::uint16_t;
+using uint32 = std::uint32_t;
+using uint64 = std::uint64_t;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_INTEGER_HPP

Property changes on: src/mpt/base/integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/macros.hpp
===================================================================
--- src/mpt/base/macros.hpp	(nonexistent)
+++ src/mpt/base/macros.hpp	(working copy)
@@ -0,0 +1,119 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_MACROS_HPP
+#define MPT_BASE_MACROS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+
+#include <type_traits>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+// Advanced inline attributes
+#if MPT_COMPILER_MSVC
+#define MPT_FORCEINLINE __forceinline
+#define MPT_NOINLINE    __declspec(noinline)
+#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#define MPT_FORCEINLINE __attribute__((always_inline)) inline
+#define MPT_NOINLINE    __attribute__((noinline))
+#else
+#define MPT_FORCEINLINE inline
+#define MPT_NOINLINE
+#endif
+
+
+
+// constexpr
+#define MPT_CONSTEXPRINLINE constexpr MPT_FORCEINLINE
+#if MPT_CXX_AT_LEAST(20)
+#define MPT_CONSTEXPR20_FUN constexpr MPT_FORCEINLINE
+#define MPT_CONSTEXPR20_VAR constexpr
+#else // !C++20
+#define MPT_CONSTEXPR20_FUN MPT_FORCEINLINE
+#define MPT_CONSTEXPR20_VAR const
+#endif // C++20
+
+
+
+#define MPT_FORCE_CONSTEXPR(expr) [&]() { \
+	constexpr auto x = (expr); \
+	return x; \
+}()
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+#define MPT_IS_CONSTANT_EVALUATED20() std::is_constant_evaluated()
+#define MPT_IS_CONSTANT_EVALUATED()   std::is_constant_evaluated()
+#else // !C++20
+#define MPT_IS_CONSTANT_EVALUATED20() false
+// this pessimizes the case for C++17 by always assuming constexpr context, which implies always running constexpr-friendly code
+#define MPT_IS_CONSTANT_EVALUATED()   true
+#endif // C++20
+
+
+
+#if MPT_COMPILER_MSVC
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	__pragma(warning(push)) \
+	__pragma(warning(disable : 4127)) \
+	if (x) \
+		__pragma(warning(pop)) \
+/**/
+#endif
+
+#if MPT_COMPILER_GCC
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	_Pragma("GCC diagnostic push") \
+	_Pragma("GCC diagnostic ignored \"-Wtype-limits\"") \
+	if (x) \
+		_Pragma("GCC diagnostic pop") \
+/**/
+#endif
+
+#if MPT_COMPILER_CLANG
+#define MPT_MAYBE_CONSTANT_IF(x) \
+	_Pragma("clang diagnostic push") \
+	_Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") \
+	_Pragma("clang diagnostic ignored \"-Wtype-limits\"") \
+	_Pragma("clang diagnostic ignored \"-Wtautological-constant-out-of-range-compare\"") \
+	if (x) \
+		_Pragma("clang diagnostic pop") \
+/**/
+#endif
+
+#if !defined(MPT_MAYBE_CONSTANT_IF)
+// MPT_MAYBE_CONSTANT_IF disables compiler warnings for conditions that may in some case be either always false or always true (this may turn out to be useful in ASSERTions in some cases).
+#define MPT_MAYBE_CONSTANT_IF(x) if (x)
+#endif
+
+
+
+#if MPT_OS_WINDOWS
+#define MPT_UNUSED(x) UNREFERENCED_PARAMETER(x)
+#else
+#define MPT_UNUSED(x) static_cast<void>(x)
+#endif
+
+
+
+#define MPT_DISCARD(expr) static_cast<void>(expr)
+
+
+
+// Use MPT_RESTRICT to indicate that a pointer is guaranteed to not be aliased.
+#if MPT_COMPILER_MSVC || MPT_COMPILER_GCC || MPT_COMPILER_CLANG
+#define MPT_RESTRICT __restrict
+#else
+#define MPT_RESTRICT
+#endif
+
+
+
+#endif // MPT_BASE_MACROS_HPP

Property changes on: src/mpt/base/macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/math.hpp
===================================================================
--- src/mpt/base/math.hpp	(nonexistent)
+++ src/mpt/base/math.hpp	(working copy)
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_EMPTY_HPP
+#define MPT_BASE_EMPTY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <cmath>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_OS_DJGPP
+
+inline double round(const long double val) {
+	return ::roundl(val);
+}
+
+inline double round(const double val) {
+	return ::round(val);
+}
+
+inline float round(const float val) {
+	return ::roundf(val);
+}
+
+#else // !MPT_OS_DJGPP
+
+// C++11 std::round
+using std::round;
+
+#endif // MPT_OS_DJGPP
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_EMPTY_HPP

Property changes on: src/mpt/base/math.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/memory.hpp
===================================================================
--- src/mpt/base/memory.hpp	(nonexistent)
+++ src/mpt/base/memory.hpp	(working copy)
@@ -0,0 +1,262 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_MEMORY_HPP
+#define MPT_BASE_MEMORY_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/span.hpp"
+
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+using byte_span = mpt::span<std::byte>;
+using const_byte_span = mpt::span<const std::byte>;
+
+
+
+// Tell which types are safe for mpt::byte_cast.
+// signed char is actually not allowed to alias into an object representation,
+// which means that, if the actual type is not itself signed char but char or
+// unsigned char instead, dereferencing the signed char pointer is undefined
+// behaviour.
+template <typename T>
+struct is_byte_castable : public std::false_type { };
+template <>
+struct is_byte_castable<char> : public std::true_type { };
+template <>
+struct is_byte_castable<unsigned char> : public std::true_type { };
+template <>
+struct is_byte_castable<std::byte> : public std::true_type { };
+template <>
+struct is_byte_castable<const char> : public std::true_type { };
+template <>
+struct is_byte_castable<const unsigned char> : public std::true_type { };
+template <>
+struct is_byte_castable<const std::byte> : public std::true_type { };
+
+
+template <typename T>
+struct is_byte : public std::false_type { };
+template <>
+struct is_byte<std::byte> : public std::true_type { };
+template <>
+struct is_byte<const std::byte> : public std::true_type { };
+
+
+template <typename T>
+constexpr bool declare_binary_safe(const T &) noexcept {
+	return false;
+}
+
+constexpr bool declare_binary_safe(const char &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8 &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8 &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const std::byte &) noexcept {
+	return true;
+}
+
+// Tell which types are safe to binary write into files.
+// By default, no types are safe.
+// When a safe type gets defined,
+// also specialize this template so that IO functions will work.
+template <typename T>
+struct is_binary_safe : public std::conditional<declare_binary_safe(T{}), std::true_type, std::false_type>::type { };
+
+// Generic Specialization for arrays.
+template <typename T, std::size_t N>
+struct is_binary_safe<T[N]> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<const T[N]> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<std::array<T, N>> : public is_binary_safe<T> { };
+template <typename T, std::size_t N>
+struct is_binary_safe<const std::array<T, N>> : public is_binary_safe<T> { };
+
+
+template <typename T>
+constexpr bool check_binary_size(std::size_t size) noexcept {
+	return true
+		&& (sizeof(T) == size)
+		&& (alignof(T) == 1)
+		&& std::is_standard_layout<T>::value
+		&& std::has_unique_object_representations<T>::value
+		&& mpt::is_binary_safe<T>::value;
+}
+
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl {
+	inline Tdst operator()(Tsrc src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		// not checking is_byte_castable here because we are actually
+		// doing a static_cast and converting the value
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return static_cast<Tdst>(src);
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl<mpt::span<Tdst>, mpt::span<Tsrc>> {
+	inline mpt::span<Tdst> operator()(mpt::span<Tsrc> src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return mpt::as_span(mpt::byte_cast_impl<Tdst *, Tsrc *>()(src.data()), mpt::byte_cast_impl<Tdst *, Tsrc *>()(src.data() + src.size()));
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct byte_cast_impl<Tdst *, Tsrc *> {
+	inline Tdst * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tdst, typename Tsrc>
+struct void_cast_impl;
+
+template <typename Tdst>
+struct void_cast_impl<Tdst *, void *> {
+	inline Tdst * operator()(void * src) const noexcept {
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tdst>
+struct void_cast_impl<Tdst *, const void *> {
+	inline Tdst * operator()(const void * src) const noexcept {
+		static_assert(sizeof(Tdst) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tdst>::value);
+		static_assert(std::is_integral<Tdst>::value || mpt::is_byte<Tdst>::value);
+		return reinterpret_cast<Tdst *>(src);
+	}
+};
+
+template <typename Tsrc>
+struct void_cast_impl<void *, Tsrc *> {
+	inline void * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		return reinterpret_cast<void *>(src);
+	}
+};
+
+template <typename Tsrc>
+struct void_cast_impl<const void *, Tsrc *> {
+	inline const void * operator()(Tsrc * src) const noexcept {
+		static_assert(sizeof(Tsrc) == sizeof(std::byte));
+		static_assert(mpt::is_byte_castable<Tsrc>::value);
+		static_assert(std::is_integral<Tsrc>::value || mpt::is_byte<Tsrc>::value);
+		return reinterpret_cast<const void *>(src);
+	}
+};
+
+// casts between different byte (char) types or pointers to these types
+template <typename Tdst, typename Tsrc>
+inline Tdst byte_cast(Tsrc src) noexcept {
+	return byte_cast_impl<Tdst, Tsrc>()(src);
+}
+
+// casts between pointers to void and pointers to byte
+template <typename Tdst, typename Tsrc>
+inline Tdst void_cast(Tsrc src) noexcept {
+	return void_cast_impl<Tdst, Tsrc>()(src);
+}
+
+
+
+template <typename T>
+MPT_CONSTEXPRINLINE std::byte as_byte(T src) noexcept {
+	static_assert(std::is_integral<T>::value);
+	return static_cast<std::byte>(static_cast<uint8>(src));
+}
+
+
+
+template <typename T>
+struct as_raw_memory_impl {
+	inline mpt::const_byte_span operator()(const T & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(&v), sizeof(T));
+	}
+	inline mpt::byte_span operator()(T & v) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(&v), sizeof(T));
+	}
+};
+
+template <typename T, std::size_t N>
+struct as_raw_memory_impl<T[N]> {
+	inline mpt::const_byte_span operator()(const T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v), N * sizeof(T));
+	}
+	inline mpt::byte_span operator()(T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<std::byte *>(v), N * sizeof(T));
+	}
+};
+
+template <typename T, std::size_t N>
+struct as_raw_memory_impl<const T[N]> {
+	inline mpt::const_byte_span operator()(const T (&v)[N]) const {
+		static_assert(mpt::is_binary_safe<typename std::remove_const<T>::type>::value);
+		return mpt::as_span(reinterpret_cast<const std::byte *>(v), N * sizeof(T));
+	}
+};
+
+// In order to be able to partially specialize it,
+// as_raw_memory is implemented via a class template.
+// Do not overload or specialize as_raw_memory directly.
+// Using a wrapper (by default just around a cast to const std::byte *),
+// allows for implementing raw memory access
+// via on-demand generating a cached serialized representation.
+template <typename T>
+inline mpt::const_byte_span as_raw_memory(const T & v) {
+	return mpt::as_raw_memory_impl<T>()(v);
+}
+template <typename T>
+inline mpt::byte_span as_raw_memory(T & v) {
+	return mpt::as_raw_memory_impl<T>()(v);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_MEMORY_HPP

Property changes on: src/mpt/base/memory.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/namespace.hpp
===================================================================
--- src/mpt/base/namespace.hpp	(nonexistent)
+++ src/mpt/base/namespace.hpp	(working copy)
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_NAMESPACE_HPP
+#define MPT_BASE_NAMESPACE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/version.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+
+
+#if !defined(MPT_INLINE_NS)
+
+#define MPT_BUILD_VERSION_NAMESPACE_IMPL(a, b, c, d) v##a##_##b##_##c##_##d
+#define MPT_BUILD_VERSION_NAMESPACE(a, b, c, d)      MPT_BUILD_VERSION_NAMESPACE_IMPL(a, b, c, d)
+
+#define MPT_VERSION_NAMESPACE MPT_BUILD_VERSION_NAMESPACE(MPT_VERSION_MAJOR, MPT_VERSION_MINOR, MPT_VERSION_PATCH, MPT_VERSION_BUILD)
+
+#if MPT_OS_WINDOWS
+#ifdef UNICODE
+#define MPT_VERSION_ABI_OS u
+#else
+#define MPT_VERSION_ABI_OS 8
+#endif
+#else
+#define MPT_VERSION_ABI_OS _
+#endif
+
+#if MPT_LIBC_GENERIC
+#define MPT_VERSION_ABI_LIBC _
+#elif MPT_LIBC_MS
+#ifdef _DLL
+#ifdef _DEBUG
+#define MPT_VERSION_ABI_LIBC MDd
+#else
+#define MPT_VERSION_ABI_LIBC MDr
+#endif
+#else
+#ifdef _DEBUG
+#define MPT_VERSION_ABI_LIBC MTd
+#else
+#define MPT_VERSION_ABI_LIBC MTr
+#endif
+#endif
+#elif MPT_LIBC_GLIBC
+#define MPT_VERSION_ABI_LIBC G
+#else
+#define MPT_VERSION_ABI_LIBC _
+#endif
+
+#define MPT_BUILD_ABI_NAMESPACE_IMPL(a, b) ABI_##a##_##b
+#define MPT_BUILD_ABI_NAMESPACE(a, b)      MPT_BUILD_ABI_NAMESPACE_IMPL(a, b)
+
+#define MPT_ABI_NAMESPACE MPT_BUILD_ABI_NAMESPACE(MPT_VERSION_ABI_OS, MPT_VERSION_ABI_LIBC)
+
+#if !defined(MPT_PROJECT_NAMESPACE)
+MPT_WARNING("Please #define MPT_PROJECT_NAMESPACE or #define MPT_INLINE_NS in build configuration.")
+#define MPT_PROJECT_NAMESPACE x
+#endif // !MPT_PROJECT_NAMESPACE
+
+#define MPT_BUILD_INLINE_NS_IMPL(a, b, c) a##_##b##_##c
+#define MPT_BUILD_INLINE_NS(a, b, c)      MPT_BUILD_INLINE_NS_IMPL(a, b, c)
+
+#define MPT_INLINE_NS MPT_BUILD_INLINE_NS(MPT_VERSION_NAMESPACE, MPT_ABI_NAMESPACE, MPT_PROJECT_NAMESPACE)
+
+#endif // !MPT_INLINE_NS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_NAMESPACE_HPP

Property changes on: src/mpt/base/namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/numeric.hpp
===================================================================
--- src/mpt/base/numeric.hpp	(nonexistent)
+++ src/mpt/base/numeric.hpp	(working copy)
@@ -0,0 +1,89 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_NUMERIC_HPP
+#define MPT_BASE_NUMERIC_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/saturate_cast.hpp"
+
+#include <algorithm>
+#include <limits>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tmod, Tmod m>
+struct ModIfNotZeroImpl {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		static_assert(std::numeric_limits<Tmod>::is_integer);
+		static_assert(!std::numeric_limits<Tmod>::is_signed);
+		static_assert(std::numeric_limits<Tval>::is_integer);
+		static_assert(!std::numeric_limits<Tval>::is_signed);
+		return static_cast<Tval>(x % m);
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint8, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint16, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint32, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+template <>
+struct ModIfNotZeroImpl<uint64, 0> {
+	template <typename Tval>
+	constexpr Tval mod(Tval x) {
+		return x;
+	}
+};
+
+// Returns x % m if m != 0, x otherwise.
+// i.e. "return (m == 0) ? x : (x % m);", but without causing a warning with stupid older compilers
+template <typename Tmod, Tmod m, typename Tval>
+constexpr Tval modulo_if_not_zero(Tval x) {
+	return ModIfNotZeroImpl<Tmod, m>().mod(x);
+}
+
+// rounds x up to multiples of target
+template <typename T>
+constexpr T align_up(T x, T target) {
+	return ((x + (target - 1)) / target) * target;
+}
+
+// rounds x down to multiples of target
+template <typename T>
+constexpr T align_down(T x, T target) {
+	return (x / target) * target;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_ALGORITHM_HPP

Property changes on: src/mpt/base/numeric.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/pointer.hpp
===================================================================
--- src/mpt/base/pointer.hpp	(nonexistent)
+++ src/mpt/base/pointer.hpp	(working copy)
@@ -0,0 +1,54 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_POINTER_HPP
+#define MPT_BASE_POINTER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+inline constexpr int arch_bits = sizeof(void *) * 8;
+inline constexpr std::size_t pointer_size = sizeof(void *);
+
+
+template <typename Tdst, typename Tsrc>
+struct pointer_cast_helper {
+	static constexpr Tdst cast(const Tsrc & src) noexcept {
+		return src;
+	}
+};
+
+template <typename Tdst, typename Tptr>
+struct pointer_cast_helper<Tdst, const Tptr *> {
+	static constexpr Tdst cast(const Tptr * const & src) noexcept {
+		return reinterpret_cast<const Tdst>(src);
+	}
+};
+template <typename Tdst, typename Tptr>
+struct pointer_cast_helper<Tdst, Tptr *> {
+	static constexpr Tdst cast(const Tptr * const & src) noexcept {
+		return reinterpret_cast<const Tdst>(src);
+	}
+};
+
+
+template <typename Tdst, typename Tsrc>
+constexpr Tdst pointer_cast(const Tsrc & src) noexcept {
+	return pointer_cast_helper<Tdst, Tsrc>::cast(src);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_POINTER_HPP

Property changes on: src/mpt/base/pointer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/preprocessor.hpp
===================================================================
--- src/mpt/base/preprocessor.hpp	(nonexistent)
+++ src/mpt/base/preprocessor.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_PREPROCESSOR_HPP
+#define MPT_BASE_PREPROCESSOR_HPP
+
+
+
+#define MPT_PP_DEFER(m, ...) m(__VA_ARGS__)
+
+#define MPT_PP_STRINGIFY(x) #x
+
+#define MPT_PP_JOIN_HELPER(a, b) a##b
+#define MPT_PP_JOIN(a, b)        MPT_PP_JOIN_HELPER(a, b)
+
+#define MPT_PP_UNIQUE_IDENTIFIER(prefix) MPT_PP_JOIN(prefix, __LINE__)
+
+
+
+#endif // MPT_BASE_PREPROCESSOR_HPP

Property changes on: src/mpt/base/preprocessor.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/saturate_cast.hpp
===================================================================
--- src/mpt/base/saturate_cast.hpp	(nonexistent)
+++ src/mpt/base/saturate_cast.hpp	(working copy)
@@ -0,0 +1,81 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SATURATE_CAST_HPP
+#define MPT_BASE_SATURATE_CAST_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Saturate the value of src to the domain of Tdst
+template <typename Tdst, typename Tsrc>
+constexpr Tdst saturate_cast(Tsrc src) noexcept {
+	// This code tries not only to obviously avoid overflows but also to avoid signed/unsigned comparison warnings and type truncation warnings (which in fact would be safe here) by explicit casting.
+	static_assert(std::numeric_limits<Tdst>::is_integer);
+	static_assert(std::numeric_limits<Tsrc>::is_integer);
+	if constexpr (std::numeric_limits<Tdst>::is_signed && std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(std::numeric_limits<Tdst>::min()), std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))));
+		}
+	} else if constexpr (!std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		}
+	} else if constexpr (std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed) {
+		if constexpr (sizeof(Tdst) > sizeof(Tsrc)) {
+			return static_cast<Tdst>(src);
+		} else if constexpr (sizeof(Tdst) == sizeof(Tsrc)) {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		} else {
+			return static_cast<Tdst>(std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max())));
+		}
+	} else { // Tdst unsigned, Tsrc signed
+		if constexpr (sizeof(Tdst) >= sizeof(Tsrc)) {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(0), src));
+		} else {
+			return static_cast<Tdst>(std::max(static_cast<Tsrc>(0), std::min(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))));
+		}
+	}
+}
+
+template <typename Tdst>
+constexpr Tdst saturate_cast(double src) {
+	if (src >= static_cast<double>(std::numeric_limits<Tdst>::max())) {
+		return std::numeric_limits<Tdst>::max();
+	}
+	if (src <= static_cast<double>(std::numeric_limits<Tdst>::min())) {
+		return std::numeric_limits<Tdst>::min();
+	}
+	return static_cast<Tdst>(src);
+}
+
+template <typename Tdst>
+constexpr Tdst saturate_cast(float src) {
+	if (src >= static_cast<float>(std::numeric_limits<Tdst>::max())) {
+		return std::numeric_limits<Tdst>::max();
+	}
+	if (src <= static_cast<float>(std::numeric_limits<Tdst>::min())) {
+		return std::numeric_limits<Tdst>::min();
+	}
+	return static_cast<Tdst>(src);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SATURATE_CAST_HPP

Property changes on: src/mpt/base/saturate_cast.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/saturate_round.hpp
===================================================================
--- src/mpt/base/saturate_round.hpp	(nonexistent)
+++ src/mpt/base/saturate_round.hpp	(working copy)
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SATURATE_ROUND_HPP
+#define MPT_BASE_SATURATE_ROUND_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/math.hpp"
+#include "mpt/base/saturate_cast.hpp"
+
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Rounds given double value to nearest integer value of type T.
+// Out-of-range values are saturated to the specified integer type's limits.
+
+template <typename T>
+inline T saturate_round(float val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+template <typename T>
+inline T saturate_round(double val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+template <typename T>
+inline T saturate_round(long double val) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	return mpt::saturate_cast<T>(mpt::round(val));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SATURATE_ROUND_HPP

Property changes on: src/mpt/base/saturate_round.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/secure.hpp
===================================================================
--- src/mpt/base/secure.hpp	(nonexistent)
+++ src/mpt/base/secure.hpp	(working copy)
@@ -0,0 +1,198 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SECURE_HPP
+#define MPT_BASE_SECURE_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <atomic>
+#include <utility>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace secure {
+
+
+
+inline MPT_NOINLINE void memzero(std::byte * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = static_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(void * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = static_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(char * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = reinterpret_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+inline MPT_NOINLINE void memzero(uint8 * const dst, std::size_t const len) noexcept {
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	volatile std::byte * volatile p = reinterpret_cast<volatile std::byte *>(dst);
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	for (volatile std::size_t i = 0; i < len; ++i) {
+		p[i] = std::byte{0};
+	}
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+}
+
+
+
+template <typename T>
+inline MPT_NOINLINE void clear(T & val) {
+	std::atomic_signal_fence(std::memory_order_seq_cst);
+	volatile T * volatile v = &val;
+	std::atomic_thread_fence(std::memory_order_seq_cst);
+	*v = T{};
+	std::atomic_signal_fence(std::memory_order_seq_cst);
+}
+
+
+
+class byte {
+private:
+	std::byte value;
+
+public:
+	byte() noexcept
+		: value(std::byte{0}) {
+		return;
+	}
+	explicit byte(std::byte value) noexcept
+		: value(value) {
+		return;
+	}
+	byte(const byte & other) noexcept
+		: value(other.value) {
+		return;
+	}
+	byte(byte && other) noexcept
+		: value(std::move(other.value)) {
+		mpt::secure::clear(other.value);
+	}
+	byte & operator=(const byte & other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		value = other.value;
+		return *this;
+	}
+	byte & operator==(byte && other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		value = std::move(other.value);
+		mpt::secure::clear(other.value);
+		return *this;
+	}
+	explicit operator std::byte() const noexcept {
+		return value;
+	}
+	~byte() {
+		mpt::secure::clear(value);
+	}
+};
+
+
+
+class buffer {
+private:
+	std::vector<std::byte> m_data;
+
+public:
+	buffer()
+		: m_data(0) {
+		return;
+	}
+	explicit buffer(const std::vector<std::byte> & data)
+		: m_data(data) {
+		return;
+	}
+	explicit buffer(const std::byte * beg, const std::byte * end)
+		: m_data(beg, end) {
+		return;
+	}
+	buffer(const buffer & other)
+		: m_data(other.m_data) {
+		return;
+	}
+	buffer(buffer && other) noexcept
+		: m_data(std::move(other.m_data)) {
+		mpt::secure::memzero(other.m_data.data(), other.m_data.size());
+	}
+	buffer & operator=(const buffer & other) {
+		if (&other == this) {
+			return *this;
+		}
+		m_data = other.m_data;
+		return *this;
+	}
+	buffer & operator=(buffer && other) noexcept {
+		if (&other == this) {
+			return *this;
+		}
+		m_data = std::move(other.m_data);
+		mpt::secure::memzero(other.m_data.data(), other.m_data.size());
+		return *this;
+	}
+	~buffer() {
+		mpt::secure::memzero(m_data.data(), m_data.size());
+		m_data.resize(0);
+		m_data.shrink_to_fit();
+	}
+	explicit operator std::vector<std::byte>() const {
+		return m_data;
+	}
+	const std::byte * data() const {
+		return m_data.data();
+	}
+	std::byte * data() {
+		return m_data.data();
+	}
+	std::size_t size() const {
+		return m_data.size();
+	}
+};
+
+
+
+} // namespace secure
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SECURE_HPP

Property changes on: src/mpt/base/secure.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/semantic_version.hpp
===================================================================
--- src/mpt/base/semantic_version.hpp	(nonexistent)
+++ src/mpt/base/semantic_version.hpp	(working copy)
@@ -0,0 +1,94 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SEMANTIC_VERSION_HPP
+#define MPT_BASE_SEMANTIC_VERSION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/version.hpp"
+
+
+
+#include <tuple>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+struct semantic_version {
+	unsigned long long major = 0;
+	unsigned long long minor = 0;
+	unsigned long long patch = 0;
+	constexpr std::tuple<unsigned long long, unsigned long long, unsigned long long> as_tuple() const noexcept {
+		return std::make_tuple(major, minor, patch);
+	}
+};
+
+constexpr bool operator==(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() == b.as_tuple();
+}
+constexpr bool operator!=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() != b.as_tuple();
+}
+constexpr bool operator<(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() < b.as_tuple();
+}
+constexpr bool operator>(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() > b.as_tuple();
+}
+constexpr bool operator<=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() <= b.as_tuple();
+}
+constexpr bool operator>=(semantic_version const a, semantic_version const b) noexcept {
+	return a.as_tuple() >= b.as_tuple();
+}
+
+struct version_info {
+	semantic_version semver{};
+	unsigned long long build = 0;
+	constexpr std::tuple<std::tuple<unsigned long long, unsigned long long, unsigned long long>, unsigned long long> as_tuple() const noexcept {
+		return std::make_tuple(semver.as_tuple(), build);
+	}
+	template <typename Tostream>
+	friend Tostream & operator<<(Tostream & os, version_info const vi) {
+		if (vi.build > 0) {
+			os << vi.semver.major << "." << vi.semver.minor << "." << vi.semver.patch << "+build." << vi.build;
+		} else {
+			os << vi.semver.major << "." << vi.semver.minor << "." << vi.semver.patch;
+		}
+		return os;
+	}
+};
+
+constexpr bool operator==(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() == b.as_tuple();
+}
+constexpr bool operator!=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() != b.as_tuple();
+}
+constexpr bool operator<(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() < b.as_tuple();
+}
+constexpr bool operator>(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() > b.as_tuple();
+}
+constexpr bool operator<=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() <= b.as_tuple();
+}
+constexpr bool operator>=(version_info const a, version_info const b) noexcept {
+	return a.as_tuple() >= b.as_tuple();
+}
+
+constexpr inline version_info Version = {{MPT_VERSION_MAJOR, MPT_VERSION_MINOR, MPT_VERSION_PATCH}, MPT_VERSION_BUILD};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SEMANTIC_VERSION_HPP

Property changes on: src/mpt/base/semantic_version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/source_location.hpp
===================================================================
--- src/mpt/base/source_location.hpp	(nonexistent)
+++ src/mpt/base/source_location.hpp	(working copy)
@@ -0,0 +1,115 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SOURCE_LOCATION_HPP
+#define MPT_BASE_SOURCE_LOCATION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_CXX_AT_LEAST(20)
+#include <source_location>
+#endif // C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::source_location;
+
+#define MPT_SOURCE_LOCATION_CURRENT() std::source_location::current()
+
+#else // !C++20
+
+#if MPT_COMPILER_MSVC && MPT_MSVC_AT_LEAST(2019, 6)
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   __builtin_COLUMN()
+
+#elif MPT_COMPILER_GCC
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   0
+
+#elif MPT_COMPILER_CLANG && MPT_CLANG_AT_LEAST(9, 0, 0)
+
+#define MPT_SOURCE_LOCATION_FILE     __builtin_FILE()
+#define MPT_SOURCE_LOCATION_FUNCTION __builtin_FUNCTION()
+#define MPT_SOURCE_LOCATION_LINE     __builtin_LINE()
+#define MPT_SOURCE_LOCATION_COLUMN   __builtin_COLUMN()
+
+#else
+
+#define MPT_SOURCE_LOCATION_FILE     __FILE__
+#define MPT_SOURCE_LOCATION_FUNCTION ""
+#define MPT_SOURCE_LOCATION_LINE     __LINE__
+#define MPT_SOURCE_LOCATION_COLUMN   0
+
+#endif
+
+// compatible with C++20 std::source_location
+struct source_location {
+private:
+	const char * m_file_name;
+	const char * m_function_name;
+	uint32 m_line;
+	uint32 m_column;
+
+public:
+	constexpr source_location() noexcept
+		: m_file_name("")
+		, m_function_name("")
+		, m_line(0)
+		, m_column(0) {
+	}
+	constexpr source_location(const char * file, const char * function, uint32 line, uint32 column) noexcept
+		: m_file_name(file)
+		, m_function_name(function)
+		, m_line(line)
+		, m_column(column) {
+	}
+	source_location(const source_location &) = default;
+	source_location(source_location &&) = default;
+	static constexpr source_location current(const char * file = MPT_SOURCE_LOCATION_FILE, const char * function = MPT_SOURCE_LOCATION_FUNCTION, uint32 line = MPT_SOURCE_LOCATION_LINE, uint32 column = MPT_SOURCE_LOCATION_COLUMN) noexcept {
+		return source_location(file, function, line, column);
+	}
+	constexpr uint32 line() const noexcept {
+		return m_line;
+	}
+	constexpr uint32 column() const noexcept {
+		return m_column;
+	}
+	constexpr const char * file_name() const noexcept {
+		return m_file_name;
+	}
+	constexpr const char * function_name() const noexcept {
+		return m_function_name;
+	}
+};
+
+
+#if (MPT_COMPILER_MSVC && MPT_MSVC_AT_LEAST(2019, 6)) || MPT_COMPILER_GCC || (MPT_COMPILER_CLANG && MPT_CLANG_AT_LEAST(9, 0, 0))
+#define MPT_SOURCE_LOCATION_CURRENT() mpt::source_location::current()
+#else
+#define MPT_SOURCE_LOCATION_CURRENT() mpt::source_location::current(__FILE__, __func__, __LINE__, 0)
+#endif
+
+#endif // C++20
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SOURCE_LOCATION_HPP

Property changes on: src/mpt/base/source_location.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/span.hpp
===================================================================
--- src/mpt/base/span.hpp	(nonexistent)
+++ src/mpt/base/span.hpp	(working copy)
@@ -0,0 +1,213 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_SPAN_HPP
+#define MPT_BASE_SPAN_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#if MPT_CXX_AT_LEAST(20)
+#include <span>
+#else // !C++20
+#include <iterator>
+#include <limits>
+#include <type_traits>
+#endif // C++20
+
+#if MPT_CXX_BEFORE(20)
+#include <cstddef>
+#endif // !C++20
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::dynamic_extent;
+using std::span;
+
+#else // !C++20
+
+//  Simplified version of gsl::span.
+//  Non-owning read-only or read-write view into a contiguous block of T
+// objects, i.e. equivalent to a (beg,end) or (data,size) tuple.
+//  Can eventually be replaced without further modifications with a full C++20
+// std::span.
+
+inline constexpr std::size_t dynamic_extent = std::numeric_limits<std::size_t>::max();
+
+template <typename T>
+class span {
+
+public:
+	using element_type = T;
+	using value_type = typename std::remove_cv<T>::type;
+	using index_type = std::size_t;
+	using pointer = T *;
+	using const_pointer = const T *;
+	using reference = T &;
+	using const_reference = const T &;
+
+	using iterator = pointer;
+	using const_iterator = const_pointer;
+
+	using difference_type = typename std::iterator_traits<iterator>::difference_type;
+
+private:
+	T * m_beg;
+	T * m_end;
+
+public:
+	span() noexcept
+		: m_beg(nullptr)
+		, m_end(nullptr) {
+	}
+
+	span(pointer beg, pointer end)
+		: m_beg(beg)
+		, m_end(end) {
+	}
+
+	span(pointer data, index_type size)
+		: m_beg(data)
+		, m_end(data + size) {
+	}
+
+	template <std::size_t N>
+	span(element_type (&arr)[N])
+		: m_beg(arr)
+		, m_end(arr + N) {
+	}
+
+	template <std::size_t N>
+	span(std::array<value_type, N> & arr)
+		: m_beg(arr.data())
+		, m_end(arr.data() + arr.size()) {
+	}
+
+	template <std::size_t N>
+	span(const std::array<value_type, N> & arr)
+		: m_beg(arr.data())
+		, m_end(arr.data() + arr.size()) {
+	}
+
+	span(const span & other) noexcept = default;
+
+	template <typename U>
+	span(const span<U> & other)
+		: m_beg(other.begin())
+		, m_end(other.end()) {
+	}
+
+	span & operator=(const span & other) noexcept = default;
+
+	iterator begin() const {
+		return iterator(m_beg);
+	}
+
+	iterator end() const {
+		return iterator(m_end);
+	}
+
+	const_iterator cbegin() const {
+		return const_iterator(begin());
+	}
+
+	const_iterator cend() const {
+		return const_iterator(end());
+	}
+
+	reference operator[](index_type index) {
+		return at(index);
+	}
+
+	const_reference operator[](index_type index) const {
+		return at(index);
+	}
+
+	bool operator==(span const & other) const noexcept {
+		return size() == other.size() && (m_beg == other.m_beg || std::equal(begin(), end(), other.begin()));
+	}
+
+	bool operator!=(span const & other) const noexcept {
+		return !(*this == other);
+	}
+
+	reference at(index_type index) {
+		return m_beg[index];
+	}
+
+	const_reference at(index_type index) const {
+		return m_beg[index];
+	}
+
+	pointer data() const noexcept {
+		return m_beg;
+	}
+
+	bool empty() const noexcept {
+		return size() == 0;
+	}
+
+	index_type size() const noexcept {
+		return static_cast<index_type>(std::distance(m_beg, m_end));
+	}
+
+	index_type length() const noexcept {
+		return size();
+	}
+
+	span subspan(std::size_t offset, std::size_t count = mpt::dynamic_extent) const {
+		return span(data() + offset, (count == mpt::dynamic_extent) ? (size() - offset) : count);
+	}
+
+	span first(std::size_t count) const {
+		return span(data(), count);
+	}
+
+	span last(std::size_t count) const {
+		return span(data() + (size() - count), count);
+	}
+
+}; // class span
+
+#endif // C++20
+
+template <typename T>
+inline span<T> as_span(T * beg, T * end) {
+	return span<T>(beg, end);
+}
+
+template <typename T>
+inline span<T> as_span(T * data, std::size_t size) {
+	return span<T>(data, size);
+}
+
+template <typename T, std::size_t N>
+inline span<T> as_span(T (&arr)[N]) {
+	return span<T>(std::begin(arr), std::end(arr));
+}
+
+template <typename T, std::size_t N>
+inline span<T> as_span(std::array<T, N> & cont) {
+	return span<T>(cont);
+}
+
+template <typename T, std::size_t N>
+inline span<const T> as_span(const std::array<T, N> & cont) {
+	return span<const T>(cont);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_SPAN_HPP

Property changes on: src/mpt/base/span.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_arithmetic_shift.hpp
===================================================================
--- src/mpt/base/tests/tests_base_arithmetic_shift.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_arithmetic_shift.hpp	(working copy)
@@ -0,0 +1,314 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP
+#define MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP
+
+
+
+#include "mpt/base/arithmetic_shift.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_arithmetic_shift{
+	"mpt/base/arithmetic_shift",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 1), mpt::rshift_signed_standard<int16>(-32768, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 1), mpt::rshift_signed_standard<int16>(-32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 1), mpt::rshift_signed_standard<int16>(-32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 1), mpt::rshift_signed_standard<int16>(-2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 1), mpt::rshift_signed_standard<int16>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 1), mpt::rshift_signed_standard<int16>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 1), mpt::rshift_signed_standard<int16>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 1), mpt::rshift_signed_standard<int16>(2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 1), mpt::rshift_signed_standard<int16>(32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 1), mpt::rshift_signed_standard<int16>(32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 14), mpt::rshift_signed_standard<int16>(-32768, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 14), mpt::rshift_signed_standard<int16>(-32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 14), mpt::rshift_signed_standard<int16>(-32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 14), mpt::rshift_signed_standard<int16>(-2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 14), mpt::rshift_signed_standard<int16>(-1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 14), mpt::rshift_signed_standard<int16>(0, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 14), mpt::rshift_signed_standard<int16>(1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 14), mpt::rshift_signed_standard<int16>(2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 14), mpt::rshift_signed_standard<int16>(32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 14), mpt::rshift_signed_standard<int16>(32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 15), mpt::rshift_signed_standard<int16>(-32768, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 15), mpt::rshift_signed_standard<int16>(-32767, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 15), mpt::rshift_signed_standard<int16>(-32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 15), mpt::rshift_signed_standard<int16>(-2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 15), mpt::rshift_signed_standard<int16>(-1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 15), mpt::rshift_signed_standard<int16>(0, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 15), mpt::rshift_signed_standard<int16>(1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 15), mpt::rshift_signed_standard<int16>(2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 15), mpt::rshift_signed_standard<int16>(32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 15), mpt::rshift_signed_standard<int16>(32767, 15));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 1), mpt::lshift_signed_standard<int16>(-32768, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 1), mpt::lshift_signed_standard<int16>(-32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 1), mpt::lshift_signed_standard<int16>(-32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 1), mpt::lshift_signed_standard<int16>(-2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 1), mpt::lshift_signed_standard<int16>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 1), mpt::lshift_signed_standard<int16>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 1), mpt::lshift_signed_standard<int16>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 1), mpt::lshift_signed_standard<int16>(2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 1), mpt::lshift_signed_standard<int16>(32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 1), mpt::lshift_signed_standard<int16>(32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 14), mpt::lshift_signed_standard<int16>(-32768, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 14), mpt::lshift_signed_standard<int16>(-32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 14), mpt::lshift_signed_standard<int16>(-32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 14), mpt::lshift_signed_standard<int16>(-2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 14), mpt::lshift_signed_standard<int16>(-1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 14), mpt::lshift_signed_standard<int16>(0, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 14), mpt::lshift_signed_standard<int16>(1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 14), mpt::lshift_signed_standard<int16>(2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 14), mpt::lshift_signed_standard<int16>(32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 14), mpt::lshift_signed_standard<int16>(32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 15), mpt::lshift_signed_standard<int16>(-32768, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 15), mpt::lshift_signed_standard<int16>(-32767, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 15), mpt::lshift_signed_standard<int16>(-32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 15), mpt::lshift_signed_standard<int16>(-2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 15), mpt::lshift_signed_standard<int16>(-1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 15), mpt::lshift_signed_standard<int16>(0, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 15), mpt::lshift_signed_standard<int16>(1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 15), mpt::lshift_signed_standard<int16>(2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 15), mpt::lshift_signed_standard<int16>(32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 15), mpt::lshift_signed_standard<int16>(32767, 15));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 1), (-32768) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 1), (-32767) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 1), (-32766) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 1), (-2) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 1), (-1) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 1), (0) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 1), (1) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 1), (2) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 1), (32766) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 1), (32767) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 14), (-32768) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 14), (-32767) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 14), (-32766) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 14), (-2) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 14), (-1) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 14), (0) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 14), (1) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 14), (2) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 14), (32766) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 14), (32767) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 15), (-32768) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 15), (-32767) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 15), (-32766) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 15), (-2) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 15), (-1) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 15), (0) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 15), (1) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 15), (2) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 15), (32766) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 15), (32767) >> 15);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 1), (-32768) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 1), (-32767) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 1), (-32766) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 1), (-2) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 1), (-1) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 1), (0) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 1), (1) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 1), (2) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 1), (32766) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 1), (32767) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 14), (-32768) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 14), (-32767) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 14), (-32766) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 14), (-2) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 14), (-1) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 14), (0) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 14), (1) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 14), (2) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 14), (32766) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 14), (32767) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 15), (-32768) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 15), (-32767) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 15), (-32766) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 15), (-2) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 15), (-1) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 15), (0) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 15), (1) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 15), (2) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 15), (32766) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 15), (32767) << 15);
+
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 1), mpt::rshift_signed_standard<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 1), mpt::rshift_signed_standard<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 1), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 1), mpt::rshift_signed_standard<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 1), mpt::rshift_signed_standard<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 1), mpt::rshift_signed_standard<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 1), mpt::rshift_signed_standard<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 1), mpt::rshift_signed_standard<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 31), mpt::rshift_signed_standard<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_standard<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 31), mpt::rshift_signed_standard<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 31), mpt::rshift_signed_standard<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 31), mpt::rshift_signed_standard<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 31), mpt::rshift_signed_standard<int32>(0x7fffffff, 31));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 1), mpt::lshift_signed_standard<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 1), mpt::lshift_signed_standard<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 1), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 1), mpt::lshift_signed_standard<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 1), mpt::lshift_signed_standard<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 1), mpt::lshift_signed_standard<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 1), mpt::lshift_signed_standard<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 1), mpt::lshift_signed_standard<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 31), mpt::lshift_signed_standard<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_standard<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 31), mpt::lshift_signed_standard<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 31), mpt::lshift_signed_standard<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 31), mpt::lshift_signed_standard<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 31), mpt::lshift_signed_standard<int32>(0x7fffffff, 31));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 1), mpt::rshift_signed_undefined<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 1), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 1), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 1), mpt::rshift_signed_undefined<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 1), mpt::rshift_signed_undefined<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 1), mpt::rshift_signed_undefined<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 1), mpt::rshift_signed_undefined<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 1), mpt::rshift_signed_undefined<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 31), mpt::rshift_signed_undefined<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 31), mpt::rshift_signed_undefined<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 31), mpt::rshift_signed_undefined<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 31), mpt::rshift_signed_undefined<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(0x7fffffff, 31));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 1), mpt::lshift_signed_undefined<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 1), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 1), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 1), mpt::lshift_signed_undefined<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 1), mpt::lshift_signed_undefined<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 1), mpt::lshift_signed_undefined<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 1), mpt::lshift_signed_undefined<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 1), mpt::lshift_signed_undefined<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 31), mpt::lshift_signed_undefined<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 31), mpt::lshift_signed_undefined<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 31), mpt::lshift_signed_undefined<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 31), mpt::lshift_signed_undefined<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(0x7fffffff, 31));
+
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::rshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 1), mpt::rshift_signed_standard<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 1), mpt::rshift_signed_standard<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 1), mpt::rshift_signed_standard<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::rshift_signed_standard<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::rshift_signed_standard<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::rshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 63), mpt::rshift_signed_standard<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 63), mpt::rshift_signed_standard<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 63), mpt::rshift_signed_standard<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(0x7fffffffffffffffll, 63));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::lshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 1), mpt::lshift_signed_standard<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 1), mpt::lshift_signed_standard<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 1), mpt::lshift_signed_standard<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::lshift_signed_standard<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::lshift_signed_standard<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::lshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 63), mpt::lshift_signed_standard<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 63), mpt::lshift_signed_standard<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 63), mpt::lshift_signed_standard<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(0x7fffffffffffffffll, 63));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::rshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 1), mpt::rshift_signed_undefined<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 1), mpt::rshift_signed_undefined<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 1), mpt::rshift_signed_undefined<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::rshift_signed_undefined<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::rshift_signed_undefined<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::rshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 63), mpt::rshift_signed_undefined<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 63), mpt::rshift_signed_undefined<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 63), mpt::rshift_signed_undefined<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(0x7fffffffffffffffll, 63));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::lshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 1), mpt::lshift_signed_undefined<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 1), mpt::lshift_signed_undefined<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 1), mpt::lshift_signed_undefined<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::lshift_signed_undefined<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::lshift_signed_undefined<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::lshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 63), mpt::lshift_signed_undefined<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 63), mpt::lshift_signed_undefined<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 63), mpt::lshift_signed_undefined<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(0x7fffffffffffffffll, 63));
+
+#endif
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP

Property changes on: src/mpt/base/tests/tests_base_arithmetic_shift.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_bit.hpp
===================================================================
--- src/mpt/base/tests/tests_base_bit.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_bit.hpp	(working copy)
@@ -0,0 +1,214 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_BASE_BIT_HPP
+#define MPT_BASE_TESTS_BASE_BIT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_bit{
+	"mpt/base/bit",
+	[](mpt::test::context & context) {
+
+#if MPT_CXX_BEFORE(20)
+		MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian_probe());
+#endif
+		MPT_MAYBE_CONSTANT_IF(mpt::endian_is_little()) {
+			MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::little);
+			MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+				MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::little);
+			}
+#if MPT_CXX_BEFORE(20)
+			MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::little);
+#endif
+		}
+		MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big()) {
+			MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::big);
+			MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+				MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::big);
+			}
+#if MPT_CXX_BEFORE(20)
+			MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::big);
+#endif
+		}
+
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(static_cast<uint32>(int32(-1))), 32);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(0u), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(1u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(2u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(3u), 2);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(0u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(1u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(2u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(3u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(4u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(5u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(6u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(7u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(8u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(9u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x7fffffffu)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x80000000u)), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x80000001u)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0xfffffffeu)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0xffffffffu)), false);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(0u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(3u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(4u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(5u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(6u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(7u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(8u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(9u), 16u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x7fffffffu)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x80000000u)), 0x80000000u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x80000001u)), 0u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0xfffffffeu)), 0u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0xffffffffu)), 0u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(0u), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(3u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(4u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(5u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(6u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(7u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(8u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(9u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x7fffffffu)), 0x40000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x80000000u)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x80000001u)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xfffffffeu)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xffffffffu)), 0x80000000u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(0u), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(3u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(4u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(5u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(6u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(7u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(8u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(9u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x7fffffffu)), 31u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000000u)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000001u)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xfffffffeu)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xffffffffu)), 32u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000001)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000011)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00001111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00011111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b01111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111111)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111110)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111100)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111000)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11110000)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11100000)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11000000)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b10000000)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000001)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000011)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000111)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00001111)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00011111)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00111111)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b01111111)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111110)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111100)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11110000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11100000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b10000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000001)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000011)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000111)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00001111)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00011111)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00111111)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b01111111)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111111)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111110)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111100)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11110000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11100000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b10000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000001)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000011)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00001111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00011111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b01111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111110)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111100)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111000)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11110000)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11100000)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11000000)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b10000000)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0xffffffffu), 32);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0xfffffffeu), 31);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x80000000u), 31);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x7fffffffu), 31);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x7ffffffeu), 30);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000007u), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000006u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000005u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000004u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000003u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000002u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000001u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000000u), 0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_BASE_BIT_HPP

Property changes on: src/mpt/base/tests/tests_base_bit.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_math.hpp
===================================================================
--- src/mpt/base/tests/tests_base_math.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_math.hpp	(working copy)
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_MATH_HPP
+#define MPT_BASE_TESTS_MATH_HPP
+
+
+
+#include "mpt/base/math.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_math{
+	"mpt/base/math",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.99), 2.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.5), 2.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.1), 1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.1), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.5), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.9), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-1.4), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-1.7), -2.0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_MATH_HPP

Property changes on: src/mpt/base/tests/tests_base_math.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_saturate_cast.hpp
===================================================================
--- src/mpt/base/tests/tests_base_saturate_cast.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_saturate_cast.hpp	(working copy)
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_SATURATE_CAST_HPP
+#define MPT_BASE_TESTS_SATURATE_CAST_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_saturate_cast{
+	"mpt/base/saturate_cast",
+	[](mpt::test::context & context) {
+		// trivials
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(-1), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(0), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(1), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(std::numeric_limits<int>::min()), std::numeric_limits<int>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(std::numeric_limits<int>::max()), std::numeric_limits<int>::max());
+
+		// signed / unsigned
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<uint16>::min()), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<uint16>::max()), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint32>::min()), (int32)std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint32>::max()), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int64>(std::numeric_limits<uint64>::min()), (int64)std::numeric_limits<uint64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int64>(std::numeric_limits<uint64>::max()), std::numeric_limits<int64>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min()), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max()), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min()), std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max()), (uint32)std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint64>(std::numeric_limits<int64>::min()), std::numeric_limits<uint64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint64>(std::numeric_limits<int64>::max()), (uint64)std::numeric_limits<int64>::max());
+
+		// overflow
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<int16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<int16>::max() + 1), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<int32>::max() + int64(1)), std::numeric_limits<int32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max() + 1), (uint16)std::numeric_limits<int16>::max() + 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max() + int64(1)), (uint32)std::numeric_limits<int32>::max() + 1);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(int16(32000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(int16(-32000)), -128);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(uint16(32000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(uint16(64000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(int16(32000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(int16(-32000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(uint16(32000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(uint16(64000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(int16(-32000)), -32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(uint16(64000)), 32767);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(int16(-32000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(uint16(64000)), 64000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(int16(-32000)), -32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(uint16(64000)), 64000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(int16(32000)), 32000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(int16(-32000)), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(uint16(32000)), 32000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(uint16(64000)), 64000u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int64>::max() - 1), std::numeric_limits<uint32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint64>::max() - 1), std::numeric_limits<int32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(static_cast<double>(std::numeric_limits<int64>::max())), std::numeric_limits<uint32>::max());
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_SATURATE_CAST_HPP

Property changes on: src/mpt/base/tests/tests_base_saturate_cast.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_saturate_round.hpp
===================================================================
--- src/mpt/base/tests/tests_base_saturate_round.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_saturate_round.hpp	(working copy)
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_SATURATE_ROUND_HPP
+#define MPT_BASE_TESTS_SATURATE_ROUND_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_round.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_saturate_round{
+	"mpt/base/saturate_round",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::max() + 0.1), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::max() - 0.4), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::min() + 0.1), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::min() - 0.1), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<uint32>(std::numeric_limits<uint32>::max() + 0.499), std::numeric_limits<uint32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(110.1), 110);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(-110.1), -110);
+
+		// These should fail to compile
+		//mpt::saturate_round<std::string>(1.0);
+		//mpt::saturate_round<int64>(1.0);
+		//mpt::saturate_round<uint64>(1.0);
+
+		// This should trigger assert in Round.
+		//MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(-129), 0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_SATURATE_ROUND_HPP

Property changes on: src/mpt/base/tests/tests_base_saturate_round.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_wrapping_divide.hpp
===================================================================
--- src/mpt/base/tests/tests_base_wrapping_divide.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_wrapping_divide.hpp	(working copy)
@@ -0,0 +1,163 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP
+#define MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/wrapping_divide.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_wrapping_divide{
+	"mpt/base/wrapping_divide",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-25, 12), 11);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-24, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-23, 12), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-8, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-7, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-6, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-5, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-4, 7), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-3, 7), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-2, 7), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-1, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(0, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(0, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(1, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(2, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(3, 7), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(4, 7), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(5, 7), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(6, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(7, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(8, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(23, 12), 11);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(24, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(25, 12), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(uint32(0x7fffffff), uint32(0x80000000)), uint32(0x7fffffff));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0x7ffffffe), int32(0x7fffffff)), int32(0x7ffffffe));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(2)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(2)), int32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(2)), int32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7fffffff)), int32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7fffffff)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7fffffff)), int32(1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffe)), int32(0x7ffffffc));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7ffffffe)), int32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7ffffffe)), int32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffd)), int32(0x7ffffffa));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7ffffffd)), int32(0x7ffffffb));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7ffffffd)), int32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), int32(0x7fffffff)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7fffffff)), int32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7fffffff)), int32(0x7ffffffd));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), int32(0x7ffffffe)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7ffffffe)), int32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7ffffffe)), int32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(2)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(2)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(2)), uint32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x40000001), uint32(0xffffffff)), uint32(0xbffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x40000000), uint32(0xffffffff)), uint32(0xbfffffff));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x3fffffff), uint32(0xffffffff)), uint32(0xc0000000));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000000)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000000)), uint32(2));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000001)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000001)), uint32(2));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000001)), uint32(3));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000000)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000000)), uint32(2));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7fffffff)), uint32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7fffffff)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7fffffff)), uint32(1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffe)), uint32(0x7ffffffc));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7ffffffe)), uint32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7ffffffe)), uint32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffd)), uint32(0x7ffffffa));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7ffffffd)), uint32(0x7ffffffb));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7ffffffd)), uint32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), uint32(0x7fffffff)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7fffffff)), uint32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7fffffff)), uint32(0x7ffffffd));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), uint32(0x7ffffffe)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7ffffffe)), uint32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7ffffffe)), uint32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-15, 7), -3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-14, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-13, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-12, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-11, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-10, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-9, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-8, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-7, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-6, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-5, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-4, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-3, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-2, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-1, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(0, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(1, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(2, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(3, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(4, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(5, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(6, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(7, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(8, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(9, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(10, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(11, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(12, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(13, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(14, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(15, 7), 2);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP

Property changes on: src/mpt/base/tests/tests_base_wrapping_divide.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_arithmetic_shift.hpp
===================================================================
--- src/mpt/base/tests/tests_base_arithmetic_shift.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_arithmetic_shift.hpp	(working copy)
@@ -0,0 +1,314 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP
+#define MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP
+
+
+
+#include "mpt/base/arithmetic_shift.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_arithmetic_shift{
+	"mpt/base/arithmetic_shift",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 1), mpt::rshift_signed_standard<int16>(-32768, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 1), mpt::rshift_signed_standard<int16>(-32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 1), mpt::rshift_signed_standard<int16>(-32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 1), mpt::rshift_signed_standard<int16>(-2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 1), mpt::rshift_signed_standard<int16>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 1), mpt::rshift_signed_standard<int16>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 1), mpt::rshift_signed_standard<int16>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 1), mpt::rshift_signed_standard<int16>(2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 1), mpt::rshift_signed_standard<int16>(32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 1), mpt::rshift_signed_standard<int16>(32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 14), mpt::rshift_signed_standard<int16>(-32768, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 14), mpt::rshift_signed_standard<int16>(-32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 14), mpt::rshift_signed_standard<int16>(-32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 14), mpt::rshift_signed_standard<int16>(-2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 14), mpt::rshift_signed_standard<int16>(-1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 14), mpt::rshift_signed_standard<int16>(0, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 14), mpt::rshift_signed_standard<int16>(1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 14), mpt::rshift_signed_standard<int16>(2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 14), mpt::rshift_signed_standard<int16>(32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 14), mpt::rshift_signed_standard<int16>(32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 15), mpt::rshift_signed_standard<int16>(-32768, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 15), mpt::rshift_signed_standard<int16>(-32767, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 15), mpt::rshift_signed_standard<int16>(-32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 15), mpt::rshift_signed_standard<int16>(-2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 15), mpt::rshift_signed_standard<int16>(-1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 15), mpt::rshift_signed_standard<int16>(0, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 15), mpt::rshift_signed_standard<int16>(1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 15), mpt::rshift_signed_standard<int16>(2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 15), mpt::rshift_signed_standard<int16>(32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 15), mpt::rshift_signed_standard<int16>(32767, 15));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 1), mpt::lshift_signed_standard<int16>(-32768, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 1), mpt::lshift_signed_standard<int16>(-32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 1), mpt::lshift_signed_standard<int16>(-32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 1), mpt::lshift_signed_standard<int16>(-2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 1), mpt::lshift_signed_standard<int16>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 1), mpt::lshift_signed_standard<int16>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 1), mpt::lshift_signed_standard<int16>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 1), mpt::lshift_signed_standard<int16>(2, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 1), mpt::lshift_signed_standard<int16>(32766, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 1), mpt::lshift_signed_standard<int16>(32767, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 14), mpt::lshift_signed_standard<int16>(-32768, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 14), mpt::lshift_signed_standard<int16>(-32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 14), mpt::lshift_signed_standard<int16>(-32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 14), mpt::lshift_signed_standard<int16>(-2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 14), mpt::lshift_signed_standard<int16>(-1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 14), mpt::lshift_signed_standard<int16>(0, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 14), mpt::lshift_signed_standard<int16>(1, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 14), mpt::lshift_signed_standard<int16>(2, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 14), mpt::lshift_signed_standard<int16>(32766, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 14), mpt::lshift_signed_standard<int16>(32767, 14));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 15), mpt::lshift_signed_standard<int16>(-32768, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 15), mpt::lshift_signed_standard<int16>(-32767, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 15), mpt::lshift_signed_standard<int16>(-32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 15), mpt::lshift_signed_standard<int16>(-2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 15), mpt::lshift_signed_standard<int16>(-1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 15), mpt::lshift_signed_standard<int16>(0, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 15), mpt::lshift_signed_standard<int16>(1, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 15), mpt::lshift_signed_standard<int16>(2, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 15), mpt::lshift_signed_standard<int16>(32766, 15));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 15), mpt::lshift_signed_standard<int16>(32767, 15));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 1), (-32768) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 1), (-32767) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 1), (-32766) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 1), (-2) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 1), (-1) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 1), (0) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 1), (1) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 1), (2) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 1), (32766) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 1), (32767) >> 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 14), (-32768) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 14), (-32767) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 14), (-32766) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 14), (-2) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 14), (-1) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 14), (0) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 14), (1) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 14), (2) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 14), (32766) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 14), (32767) >> 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32768, 15), (-32768) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32767, 15), (-32767) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-32766, 15), (-32766) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-2, 15), (-2) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(-1, 15), (-1) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(0, 15), (0) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(1, 15), (1) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(2, 15), (2) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32766, 15), (32766) >> 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int16>(32767, 15), (32767) >> 15);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 1), (-32768) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 1), (-32767) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 1), (-32766) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 1), (-2) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 1), (-1) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 1), (0) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 1), (1) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 1), (2) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 1), (32766) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 1), (32767) << 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 14), (-32768) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 14), (-32767) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 14), (-32766) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 14), (-2) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 14), (-1) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 14), (0) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 14), (1) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 14), (2) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 14), (32766) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 14), (32767) << 14);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32768, 15), (-32768) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32767, 15), (-32767) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-32766, 15), (-32766) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-2, 15), (-2) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(-1, 15), (-1) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(0, 15), (0) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(1, 15), (1) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(2, 15), (2) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32766, 15), (32766) << 15);
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int16>(32767, 15), (32767) << 15);
+
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 1), mpt::rshift_signed_standard<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 1), mpt::rshift_signed_standard<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 1), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 1), mpt::rshift_signed_standard<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 1), mpt::rshift_signed_standard<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 1), mpt::rshift_signed_standard<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 1), mpt::rshift_signed_standard<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 1), mpt::rshift_signed_standard<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 31), mpt::rshift_signed_standard<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_standard<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 31), mpt::rshift_signed_standard<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 31), mpt::rshift_signed_standard<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 31), mpt::rshift_signed_standard<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 31), mpt::rshift_signed_standard<int32>(0x7fffffff, 31));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 1), mpt::lshift_signed_standard<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 1), mpt::lshift_signed_standard<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 1), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 1), mpt::lshift_signed_standard<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 1), mpt::lshift_signed_standard<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 1), mpt::lshift_signed_standard<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 1), mpt::lshift_signed_standard<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 1), mpt::lshift_signed_standard<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 31), mpt::lshift_signed_standard<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_standard<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 31), mpt::lshift_signed_standard<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 31), mpt::lshift_signed_standard<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 31), mpt::lshift_signed_standard<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 31), mpt::lshift_signed_standard<int32>(0x7fffffff, 31));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 1), mpt::rshift_signed_undefined<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 1), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 1), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 1), mpt::rshift_signed_undefined<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 1), mpt::rshift_signed_undefined<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 1), mpt::rshift_signed_undefined<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 1), mpt::rshift_signed_undefined<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 1), mpt::rshift_signed_undefined<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0 - 0x80000000, 31), mpt::rshift_signed_undefined<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(-1, 31), mpt::rshift_signed_undefined<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0, 31), mpt::rshift_signed_undefined<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(1, 31), mpt::rshift_signed_undefined<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int32>(0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(0x7fffffff, 31));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 1), mpt::lshift_signed_undefined<int32>(0 - 0x80000000, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 1), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 1), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 1), mpt::lshift_signed_undefined<int32>(-1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 1), mpt::lshift_signed_undefined<int32>(0, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 1), mpt::lshift_signed_undefined<int32>(1, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 1), mpt::lshift_signed_undefined<int32>(0x7ffffffe, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 1), mpt::lshift_signed_undefined<int32>(0x7fffffff, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0 - 0x80000000, 31), mpt::lshift_signed_undefined<int32>(0 - 0x80000000, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(-1, 31), mpt::lshift_signed_undefined<int32>(-1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0, 31), mpt::lshift_signed_undefined<int32>(0, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(1, 31), mpt::lshift_signed_undefined<int32>(1, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(0x7ffffffe, 31));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int32>(0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(0x7fffffff, 31));
+
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::rshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 1), mpt::rshift_signed_standard<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 1), mpt::rshift_signed_standard<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 1), mpt::rshift_signed_standard<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::rshift_signed_standard<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::rshift_signed_standard<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::rshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 63), mpt::rshift_signed_standard<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 63), mpt::rshift_signed_standard<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 63), mpt::rshift_signed_standard<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(0x7fffffffffffffffll, 63));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::lshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 1), mpt::lshift_signed_standard<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 1), mpt::lshift_signed_standard<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 1), mpt::lshift_signed_standard<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::lshift_signed_standard<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::lshift_signed_standard<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::lshift_signed_standard<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 63), mpt::lshift_signed_standard<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 63), mpt::lshift_signed_standard<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 63), mpt::lshift_signed_standard<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(0x7fffffffffffffffll, 63));
+
+#if MPT_COMPILER_SHIFT_SIGNED
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::rshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 1), mpt::rshift_signed_undefined<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 1), mpt::rshift_signed_undefined<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 1), mpt::rshift_signed_undefined<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::rshift_signed_undefined<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::rshift_signed_undefined<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::rshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(-1ll, 63), mpt::rshift_signed_undefined<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0ll, 63), mpt::rshift_signed_undefined<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(1ll, 63), mpt::rshift_signed_undefined<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::rshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(0x7fffffffffffffffll, 63));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 1), mpt::lshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 1), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 1), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 1), mpt::lshift_signed_undefined<int64>(-1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 1), mpt::lshift_signed_undefined<int64>(0ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 1), mpt::lshift_signed_undefined<int64>(1ll, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 1), mpt::lshift_signed_undefined<int64>(0x7ffffffffffffffell, 1));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 1), mpt::lshift_signed_undefined<int64>(0x7fffffffffffffffll, 1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ull - 0x8000000000000000ull, 63), mpt::lshift_signed_undefined<int64>(0ull - 0x8000000000000000ull, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(-1ll, 63), mpt::lshift_signed_undefined<int64>(-1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0ll, 63), mpt::lshift_signed_undefined<int64>(0ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(1ll, 63), mpt::lshift_signed_undefined<int64>(1ll, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(0x7ffffffffffffffell, 63));
+		MPT_TEST_EXPECT_EQUAL(mpt::lshift_signed<int64>(0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(0x7fffffffffffffffll, 63));
+
+#endif
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_ARITHMETIC_SHIFT_HPP

Property changes on: src/mpt/base/tests/tests_base_arithmetic_shift.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_bit.hpp
===================================================================
--- src/mpt/base/tests/tests_base_bit.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_bit.hpp	(working copy)
@@ -0,0 +1,214 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_BASE_BIT_HPP
+#define MPT_BASE_TESTS_BASE_BIT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_bit{
+	"mpt/base/bit",
+	[](mpt::test::context & context) {
+
+#if MPT_CXX_BEFORE(20)
+		MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian_probe());
+#endif
+		MPT_MAYBE_CONSTANT_IF(mpt::endian_is_little()) {
+			MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::little);
+			MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+				MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::little);
+			}
+#if MPT_CXX_BEFORE(20)
+			MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::little);
+#endif
+		}
+		MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big()) {
+			MPT_TEST_EXPECT_EQUAL(mpt::get_endian(), mpt::endian::big);
+			MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big)) {
+				MPT_TEST_EXPECT_EQUAL(mpt::endian::native, mpt::endian::big);
+			}
+#if MPT_CXX_BEFORE(20)
+			MPT_TEST_EXPECT_EQUAL(mpt::endian_probe(), mpt::endian::big);
+#endif
+		}
+
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(static_cast<uint32>(int32(-1))), 32);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(0u), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(1u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(2u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::popcount(3u), 2);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(0u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(1u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(2u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(3u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(4u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(5u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(6u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(7u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(8u), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(9u), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x7fffffffu)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x80000000u)), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0x80000001u)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0xfffffffeu)), false);
+		MPT_TEST_EXPECT_EQUAL(mpt::has_single_bit(uint32(0xffffffffu)), false);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(0u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(3u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(4u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(5u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(6u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(7u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(8u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(9u), 16u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x7fffffffu)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x80000000u)), 0x80000000u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0x80000001u)), 0u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0xfffffffeu)), 0u);
+		//MPT_TEST_EXPECT_EQUAL(mpt::bit_ceil(uint32(0xffffffffu)), 0u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(0u), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(3u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(4u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(5u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(6u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(7u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(8u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(9u), 8u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x7fffffffu)), 0x40000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x80000000u)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0x80000001u)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xfffffffeu)), 0x80000000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_floor(uint32(0xffffffffu)), 0x80000000u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(0u), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(1u), 1u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(2u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(3u), 2u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(4u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(5u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(6u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(7u), 3u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(8u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(9u), 4u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x7fffffffu)), 31u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000000u)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0x80000001u)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xfffffffeu)), 32u);
+		MPT_TEST_EXPECT_EQUAL(mpt::bit_width(uint32(0xffffffffu)), 32u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000001)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000011)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00001111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00011111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b01111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111111)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111110)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111100)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11111000)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11110000)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11100000)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b11000000)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b10000000)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000001)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000011)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000111)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00001111)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00011111)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00111111)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b01111111)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111110)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111100)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11111000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11110000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11100000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b11000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b10000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000001)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000011)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000111)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00001111)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00011111)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00111111)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b01111111)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111111)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111110)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111100)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11111000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11110000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11100000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b11000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b10000000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000001)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000011)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00001111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00011111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b01111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111111)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111110)), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111100)), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11111000)), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11110000)), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11100000)), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b11000000)), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b10000000)), 7);
+		MPT_TEST_EXPECT_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0xffffffffu), 32);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0xfffffffeu), 31);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x80000000u), 31);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x7fffffffu), 31);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x7ffffffeu), 30);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000007u), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000006u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000005u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000004u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000003u), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000002u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000001u), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::lower_bound_entropy_bits(0x00000000u), 0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_BASE_BIT_HPP

Property changes on: src/mpt/base/tests/tests_base_bit.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_math.hpp
===================================================================
--- src/mpt/base/tests/tests_base_math.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_math.hpp	(working copy)
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_MATH_HPP
+#define MPT_BASE_TESTS_MATH_HPP
+
+
+
+#include "mpt/base/math.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_math{
+	"mpt/base/math",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.99), 2.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.5), 2.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(1.1), 1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.1), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.5), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-0.9), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-1.4), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::round(-1.7), -2.0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_MATH_HPP

Property changes on: src/mpt/base/tests/tests_base_math.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_saturate_cast.hpp
===================================================================
--- src/mpt/base/tests/tests_base_saturate_cast.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_saturate_cast.hpp	(working copy)
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_SATURATE_CAST_HPP
+#define MPT_BASE_TESTS_SATURATE_CAST_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_saturate_cast{
+	"mpt/base/saturate_cast",
+	[](mpt::test::context & context) {
+		// trivials
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(-1), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(0), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(1), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(std::numeric_limits<int>::min()), std::numeric_limits<int>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int>(std::numeric_limits<int>::max()), std::numeric_limits<int>::max());
+
+		// signed / unsigned
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<uint16>::min()), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<uint16>::max()), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint32>::min()), (int32)std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint32>::max()), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int64>(std::numeric_limits<uint64>::min()), (int64)std::numeric_limits<uint64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int64>(std::numeric_limits<uint64>::max()), std::numeric_limits<int64>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min()), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max()), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min()), std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max()), (uint32)std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint64>(std::numeric_limits<int64>::min()), std::numeric_limits<uint64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint64>(std::numeric_limits<int64>::max()), (uint64)std::numeric_limits<int64>::max());
+
+		// overflow
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<int16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(std::numeric_limits<int16>::max() + 1), std::numeric_limits<int16>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<int32>::max() + int64(1)), std::numeric_limits<int32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<uint16>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max() + 1), (uint16)std::numeric_limits<int16>::max() + 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<uint32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max() + int64(1)), (uint32)std::numeric_limits<int32>::max() + 1);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(int16(32000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(int16(-32000)), -128);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(uint16(32000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int8>(uint16(64000)), 127);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(int16(32000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(int16(-32000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(uint16(32000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint8>(uint16(64000)), 255);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(int16(-32000)), -32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int16>(uint16(64000)), 32767);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(int16(-32000)), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint16>(uint16(64000)), 64000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(int16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(int16(-32000)), -32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(uint16(32000)), 32000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(uint16(64000)), 64000);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(int16(32000)), 32000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(int16(-32000)), 0u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(uint16(32000)), 32000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(uint16(64000)), 64000u);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(std::numeric_limits<int64>::max() - 1), std::numeric_limits<uint32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<int32>(std::numeric_limits<uint64>::max() - 1), std::numeric_limits<int32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast<uint32>(static_cast<double>(std::numeric_limits<int64>::max())), std::numeric_limits<uint32>::max());
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_SATURATE_CAST_HPP

Property changes on: src/mpt/base/tests/tests_base_saturate_cast.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_saturate_round.hpp
===================================================================
--- src/mpt/base/tests/tests_base_saturate_round.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_saturate_round.hpp	(working copy)
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_SATURATE_ROUND_HPP
+#define MPT_BASE_TESTS_SATURATE_ROUND_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_round.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_saturate_round{
+	"mpt/base/saturate_round",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::max() + 0.1), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::max() - 0.4), std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::min() + 0.1), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int32>(std::numeric_limits<int32>::min() - 0.1), std::numeric_limits<int32>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<uint32>(std::numeric_limits<uint32>::max() + 0.499), std::numeric_limits<uint32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(110.1), 110);
+		MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(-110.1), -110);
+
+		// These should fail to compile
+		//mpt::saturate_round<std::string>(1.0);
+		//mpt::saturate_round<int64>(1.0);
+		//mpt::saturate_round<uint64>(1.0);
+
+		// This should trigger assert in Round.
+		//MPT_TEST_EXPECT_EQUAL(mpt::saturate_round<int8>(-129), 0);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_SATURATE_ROUND_HPP

Property changes on: src/mpt/base/tests/tests_base_saturate_round.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/tests/tests_base_wrapping_divide.hpp
===================================================================
--- src/mpt/base/tests/tests_base_wrapping_divide.hpp	(nonexistent)
+++ src/mpt/base/tests/tests_base_wrapping_divide.hpp	(working copy)
@@ -0,0 +1,163 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP
+#define MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/wrapping_divide.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_base_wrapping_divide{
+	"mpt/base/wrapping_divide",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-25, 12), 11);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-24, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-23, 12), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-8, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-7, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-6, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-5, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-4, 7), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-3, 7), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-2, 7), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(-1, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(0, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(0, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(1, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(2, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(3, 7), 3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(4, 7), 4);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(5, 7), 5);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(6, 7), 6);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(7, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(8, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(23, 12), 11);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(24, 12), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(25, 12), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(uint32(0x7fffffff), uint32(0x80000000)), uint32(0x7fffffff));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0x7ffffffe), int32(0x7fffffff)), int32(0x7ffffffe));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(2)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(2)), int32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(1)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(2)), int32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7fffffff)), int32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7fffffff)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7fffffff)), int32(1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffe)), int32(0x7ffffffc));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7ffffffe)), int32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7ffffffe)), int32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffd)), int32(0x7ffffffa));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(0x7ffffffd)), int32(0x7ffffffb));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(0x7ffffffd)), int32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), int32(0x7fffffff)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7fffffff)), int32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7fffffff)), int32(0x7ffffffd));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), int32(0x7ffffffe)), int32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7ffffffe)), int32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7ffffffe)), int32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(2)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(2)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(1)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(2)), uint32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x40000001), uint32(0xffffffff)), uint32(0xbffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x40000000), uint32(0xffffffff)), uint32(0xbfffffff));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x3fffffff), uint32(0xffffffff)), uint32(0xc0000000));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000000)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000000)), uint32(2));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000001)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000001)), uint32(2));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000001)), uint32(3));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x80000000)), uint32(1));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x80000000)), uint32(2));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7fffffff)), uint32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7fffffff)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7fffffff)), uint32(1));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffe)), uint32(0x7ffffffc));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7ffffffe)), uint32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7ffffffe)), uint32(0));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffd)), uint32(0x7ffffffa));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(0x7ffffffd)), uint32(0x7ffffffb));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(0x7ffffffd)), uint32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), uint32(0x7fffffff)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7fffffff)), uint32(0x7ffffffe));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7fffffff)), uint32(0x7ffffffd));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(0), uint32(0x7ffffffe)), uint32(0));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7ffffffe)), uint32(0x7ffffffd));
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7ffffffe)), uint32(0x7ffffffc));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-15, 7), -3);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-14, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-13, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-12, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-11, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-10, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-9, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-8, 7), -2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-7, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-6, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-5, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-4, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-3, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-2, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(-1, 7), -1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(0, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(1, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(2, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(3, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(4, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(5, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(6, 7), 0);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(7, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(8, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(9, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(10, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(11, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(12, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(13, 7), 1);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(14, 7), 2);
+		MPT_TEST_EXPECT_EQUAL(mpt::wrapping_divide(15, 7), 2);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_WRAPPING_DIVIDE_HPP

Property changes on: src/mpt/base/tests/tests_base_wrapping_divide.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/utility.hpp
===================================================================
--- src/mpt/base/utility.hpp	(nonexistent)
+++ src/mpt/base/utility.hpp	(working copy)
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_UTILITY_HPP
+#define MPT_BASE_UTILITY_HPP
+
+
+
+#include "mpt/base/detect_compiler.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_CXX_BEFORE(20)
+#include "mpt/base/saturate_cast.hpp"
+#endif
+
+#include <type_traits>
+#include <utility>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using std::in_range;
+
+#else
+
+// Returns true iff Tdst can represent the value val.
+// Use as if(mpt::in_range<uint8>(-1)).
+template <typename Tdst, typename Tsrc>
+constexpr bool in_range(Tsrc val) {
+	return (static_cast<Tsrc>(mpt::saturate_cast<Tdst>(val)) == val);
+}
+
+#endif
+
+
+#if MPT_CXX_AT_LEAST(23)
+
+using std::to_underlying;
+
+#else
+
+template <typename T>
+constexpr std::underlying_type_t<T> to_underlying(T value) noexcept {
+	return static_cast<typename std::underlying_type<T>::type>(value);
+}
+
+#endif
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_UTILITY_HPP

Property changes on: src/mpt/base/utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/version.hpp
===================================================================
--- src/mpt/base/version.hpp	(nonexistent)
+++ src/mpt/base/version.hpp	(working copy)
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_VERSION_HPP
+#define MPT_BASE_VERSION_HPP
+
+
+
+#define MPT_VERSION_MAJOR 0
+#define MPT_VERSION_MINOR 0
+#define MPT_VERSION_PATCH 0
+#define MPT_VERSION_BUILD 0
+
+
+
+#endif // MPT_BASE_VERSION_HPP

Property changes on: src/mpt/base/version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/base/wrapping_divide.hpp
===================================================================
--- src/mpt/base/wrapping_divide.hpp	(nonexistent)
+++ src/mpt/base/wrapping_divide.hpp	(working copy)
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_WRAPPING_DIVIDE_HPP
+#define MPT_BASE_WRAPPING_DIVIDE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Modulo with more intuitive behaviour for some contexts:
+// Instead of being symmetrical around 0, the pattern for positive numbers is repeated in the negative range.
+// For example, wrapping_modulo(-1, m) == (m - 1).
+// Behaviour is undefined if m<=0.
+template <typename T, typename M>
+constexpr auto wrapping_modulo(T x, M m) -> decltype(x % m) {
+	return (x >= 0) ? (x % m) : (m - 1 - ((-1 - x) % m));
+}
+
+template <typename T, typename D>
+constexpr auto wrapping_divide(T x, D d) -> decltype(x / d) {
+	return (x >= 0) ? (x / d) : (((x + 1) / d) - 1);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_WRAPPING_DIVIDE_HPP

Property changes on: src/mpt/base/wrapping_divide.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/base64.hpp
===================================================================
--- src/mpt/binary/base64.hpp	(nonexistent)
+++ src/mpt/binary/base64.hpp	(working copy)
@@ -0,0 +1,136 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_BASE64_HPP
+#define MPT_BINARY_BASE64_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class base64_parse_error : public std::runtime_error {
+public:
+	base64_parse_error()
+		: std::runtime_error("invalid Base64 encoding") {
+	}
+};
+
+
+inline constexpr std::array<mpt::uchar, 64> base64 = {
+	{MPT_UCHAR('A'), MPT_UCHAR('B'), MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F'), MPT_UCHAR('G'), MPT_UCHAR('H'), MPT_UCHAR('I'), MPT_UCHAR('J'), MPT_UCHAR('K'), MPT_UCHAR('L'), MPT_UCHAR('M'), MPT_UCHAR('N'), MPT_UCHAR('O'), MPT_UCHAR('P'),
+	 MPT_UCHAR('Q'), MPT_UCHAR('R'), MPT_UCHAR('S'), MPT_UCHAR('T'), MPT_UCHAR('U'), MPT_UCHAR('V'), MPT_UCHAR('W'), MPT_UCHAR('X'), MPT_UCHAR('Y'), MPT_UCHAR('Z'), MPT_UCHAR('a'), MPT_UCHAR('b'), MPT_UCHAR('c'), MPT_UCHAR('d'), MPT_UCHAR('e'), MPT_UCHAR('f'),
+	 MPT_UCHAR('g'), MPT_UCHAR('h'), MPT_UCHAR('i'), MPT_UCHAR('j'), MPT_UCHAR('k'), MPT_UCHAR('l'), MPT_UCHAR('m'), MPT_UCHAR('n'), MPT_UCHAR('o'), MPT_UCHAR('p'), MPT_UCHAR('q'), MPT_UCHAR('r'), MPT_UCHAR('s'), MPT_UCHAR('t'), MPT_UCHAR('u'), MPT_UCHAR('v'),
+	 MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('+'), MPT_UCHAR('/')}};
+
+
+template <typename Tbyte>
+inline mpt::ustring encode_base64(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(4 * ((src.size() + 2) / 3));
+	uint32 bits = 0;
+	std::size_t bytes = 0;
+	for (std::byte byte : src) {
+		bits <<= 8;
+		bits |= mpt::byte_cast<uint8>(byte);
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64[(bits >> 18) & 0x3f]);
+			result.push_back(base64[(bits >> 12) & 0x3f]);
+			result.push_back(base64[(bits >> 6) & 0x3f]);
+			result.push_back(base64[(bits >> 0) & 0x3f]);
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	std::size_t padding = 0;
+	while (bytes != 0) {
+		bits <<= 8;
+		padding++;
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64[(bits >> 18) & 0x3f]);
+			result.push_back(base64[(bits >> 12) & 0x3f]);
+			if (padding > 1) {
+				result.push_back(MPT_UCHAR('='));
+			} else {
+				result.push_back(base64[(bits >> 6) & 0x3f]);
+			}
+			if (padding > 0) {
+				result.push_back(MPT_UCHAR('='));
+			} else {
+				result.push_back(base64[(bits >> 0) & 0x3f]);
+			}
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	return result;
+}
+
+inline uint8 decode_base64_bits(mpt::uchar c) {
+	for (uint8 i = 0; i < 64; ++i) {
+		if (base64[i] == c) {
+			return i;
+		}
+	}
+	throw base64_parse_error();
+}
+
+
+inline std::vector<std::byte> decode_base64(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(3 * (src.length() / 4));
+	uint32 bits = 0;
+	std::size_t chars = 0;
+	std::size_t padding = 0;
+	for (mpt::uchar c : src) {
+		bits <<= 6;
+		if (c == MPT_UCHAR('=')) {
+			padding++;
+		} else {
+			bits |= decode_base64_bits(c);
+		}
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			if (padding < 2) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			}
+			if (padding < 1) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			}
+			bits = 0;
+			chars = 0;
+			padding = 0;
+		}
+	}
+	if (chars != 0) {
+		throw base64_parse_error();
+	}
+	return result;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_BASE64_HPP

Property changes on: src/mpt/binary/base64.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/base64url.hpp
===================================================================
--- src/mpt/binary/base64url.hpp	(nonexistent)
+++ src/mpt/binary/base64url.hpp	(working copy)
@@ -0,0 +1,139 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_BASE64URL_HPP
+#define MPT_BINARY_BASE64URL_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class base64url_parse_error : public std::runtime_error {
+public:
+	base64url_parse_error()
+		: std::runtime_error("invalid Base64URL encoding") {
+	}
+};
+
+
+inline constexpr std::array<mpt::uchar, 64> base64url = {
+	{MPT_UCHAR('A'), MPT_UCHAR('B'), MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F'), MPT_UCHAR('G'), MPT_UCHAR('H'), MPT_UCHAR('I'), MPT_UCHAR('J'), MPT_UCHAR('K'), MPT_UCHAR('L'), MPT_UCHAR('M'), MPT_UCHAR('N'), MPT_UCHAR('O'), MPT_UCHAR('P'),
+	 MPT_UCHAR('Q'), MPT_UCHAR('R'), MPT_UCHAR('S'), MPT_UCHAR('T'), MPT_UCHAR('U'), MPT_UCHAR('V'), MPT_UCHAR('W'), MPT_UCHAR('X'), MPT_UCHAR('Y'), MPT_UCHAR('Z'), MPT_UCHAR('a'), MPT_UCHAR('b'), MPT_UCHAR('c'), MPT_UCHAR('d'), MPT_UCHAR('e'), MPT_UCHAR('f'),
+	 MPT_UCHAR('g'), MPT_UCHAR('h'), MPT_UCHAR('i'), MPT_UCHAR('j'), MPT_UCHAR('k'), MPT_UCHAR('l'), MPT_UCHAR('m'), MPT_UCHAR('n'), MPT_UCHAR('o'), MPT_UCHAR('p'), MPT_UCHAR('q'), MPT_UCHAR('r'), MPT_UCHAR('s'), MPT_UCHAR('t'), MPT_UCHAR('u'), MPT_UCHAR('v'),
+	 MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('-'), MPT_UCHAR('_')}};
+
+template <typename Tbyte>
+inline mpt::ustring encode_base64url(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(4 * ((src.size() + 2) / 3));
+	uint32 bits = 0;
+	std::size_t bytes = 0;
+	for (std::byte byte : src) {
+		bits <<= 8;
+		bits |= mpt::byte_cast<uint8>(byte);
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64url[(bits >> 18) & 0x3f]);
+			result.push_back(base64url[(bits >> 12) & 0x3f]);
+			result.push_back(base64url[(bits >> 6) & 0x3f]);
+			result.push_back(base64url[(bits >> 0) & 0x3f]);
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	std::size_t padding = 0;
+	while (bytes != 0) {
+		bits <<= 8;
+		padding++;
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64url[(bits >> 18) & 0x3f]);
+			result.push_back(base64url[(bits >> 12) & 0x3f]);
+			if (padding <= 1) {
+				result.push_back(base64url[(bits >> 6) & 0x3f]);
+			}
+			if (padding <= 0) {
+				result.push_back(base64url[(bits >> 0) & 0x3f]);
+			}
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	return result;
+}
+
+inline uint8 decode_base64url_bits(mpt::uchar c) {
+	for (uint8 i = 0; i < 64; ++i)
+	{
+		if (base64url[i] == c)
+		{
+			return i;
+		}
+	}
+	throw base64url_parse_error();
+}
+
+inline std::vector<std::byte> decode_base64url(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(3 * ((src.length() + 2) / 4));
+	uint32 bits = 0;
+	std::size_t chars = 0;
+	for (mpt::uchar c : src) {
+		bits <<= 6;
+		bits |= decode_base64url_bits(c);
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			bits = 0;
+			chars = 0;
+		}
+	}
+	uint32 padding = 0;
+	if (chars != 0 && chars < 2) {
+		throw base64url_parse_error();
+	}
+	while (chars != 0) {
+		bits <<= 6;
+		padding++;
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			if (padding < 2) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			}
+			if (padding < 1) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			}
+			bits = 0;
+			chars = 0;
+			padding = 0;
+		}
+	}
+	return result;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_BASE64URL_HPP

Property changes on: src/mpt/binary/base64url.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/hex.hpp
===================================================================
--- src/mpt/binary/hex.hpp	(nonexistent)
+++ src/mpt/binary/hex.hpp	(working copy)
@@ -0,0 +1,88 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_HEX_HPP
+#define MPT_BINARY_HEX_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline constexpr std::array<mpt::uchar, 16> encode_nibble = {
+	{MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'),
+	 MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'),
+	 MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('A'), MPT_UCHAR('B'),
+	 MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F')}};
+
+
+inline bool decode_byte(uint8 & byte, mpt::uchar c1, mpt::uchar c2) {
+	byte = 0;
+	if (MPT_UCHAR('0') <= c1 && c1 <= MPT_UCHAR('9')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('0')) << 4);
+	} else if (MPT_UCHAR('A') <= c1 && c1 <= MPT_UCHAR('F')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('A') + 10) << 4);
+	} else if (MPT_UCHAR('a') <= c1 && c1 <= MPT_UCHAR('f')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('a') + 10) << 4);
+	} else {
+		return false;
+	}
+	if (MPT_UCHAR('0') <= c2 && c2 <= MPT_UCHAR('9')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('0'));
+	} else if (MPT_UCHAR('A') <= c2 && c2 <= MPT_UCHAR('F')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('A') + 10);
+	} else if (MPT_UCHAR('a') <= c2 && c2 <= MPT_UCHAR('f')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('a') + 10);
+	} else {
+		return false;
+	}
+	return true;
+}
+
+
+template <typename Tbyte>
+inline mpt::ustring encode_hex(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(src.size() * 2);
+	for (std::byte byte : src) {
+		result.push_back(encode_nibble[(mpt::byte_cast<uint8>(byte) & 0xf0) >> 4]);
+		result.push_back(encode_nibble[mpt::byte_cast<uint8>(byte) & 0x0f]);
+	}
+	return result;
+}
+
+inline std::vector<std::byte> decode_hex(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(src.size() / 2);
+	for (std::size_t i = 0; (i + 1) < src.size(); i += 2) {
+		uint8 byte = 0;
+		if (!decode_byte(byte, src[i], src[i + 1])) {
+			return result;
+		}
+		result.push_back(mpt::byte_cast<std::byte>(byte));
+	}
+	return result;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_HEX_HPP

Property changes on: src/mpt/binary/hex.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/tests/tests_binary.hpp
===================================================================
--- src/mpt/binary/tests/tests_binary.hpp	(nonexistent)
+++ src/mpt/binary/tests/tests_binary.hpp	(working copy)
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_BINARY_HPP
+#define MPT_BASE_TESTS_BINARY_HPP
+
+
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/binary/base64.hpp"
+#include "mpt/binary/base64url.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_binary{
+	"mpt/binary",
+	[](mpt::test::context & context) {
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("cGxlYXN1cmUu"));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("bGVhc3VyZS4="));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("ZWFzdXJlLg=="));
+		}
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("cGxlYXN1cmUu")));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("bGVhc3VyZS4=")));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("ZWFzdXJlLg==")));
+		}
+
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("cGxlYXN1cmUu"));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("bGVhc3VyZS4"));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("ZWFzdXJlLg"));
+		}
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("cGxlYXN1cmUu")));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("bGVhc3VyZS4")));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("ZWFzdXJlLg")));
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_BINARY_HPP

Property changes on: src/mpt/binary/tests/tests_binary.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/base64.hpp
===================================================================
--- src/mpt/binary/base64.hpp	(nonexistent)
+++ src/mpt/binary/base64.hpp	(working copy)
@@ -0,0 +1,136 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_BASE64_HPP
+#define MPT_BINARY_BASE64_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class base64_parse_error : public std::runtime_error {
+public:
+	base64_parse_error()
+		: std::runtime_error("invalid Base64 encoding") {
+	}
+};
+
+
+inline constexpr std::array<mpt::uchar, 64> base64 = {
+	{MPT_UCHAR('A'), MPT_UCHAR('B'), MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F'), MPT_UCHAR('G'), MPT_UCHAR('H'), MPT_UCHAR('I'), MPT_UCHAR('J'), MPT_UCHAR('K'), MPT_UCHAR('L'), MPT_UCHAR('M'), MPT_UCHAR('N'), MPT_UCHAR('O'), MPT_UCHAR('P'),
+	 MPT_UCHAR('Q'), MPT_UCHAR('R'), MPT_UCHAR('S'), MPT_UCHAR('T'), MPT_UCHAR('U'), MPT_UCHAR('V'), MPT_UCHAR('W'), MPT_UCHAR('X'), MPT_UCHAR('Y'), MPT_UCHAR('Z'), MPT_UCHAR('a'), MPT_UCHAR('b'), MPT_UCHAR('c'), MPT_UCHAR('d'), MPT_UCHAR('e'), MPT_UCHAR('f'),
+	 MPT_UCHAR('g'), MPT_UCHAR('h'), MPT_UCHAR('i'), MPT_UCHAR('j'), MPT_UCHAR('k'), MPT_UCHAR('l'), MPT_UCHAR('m'), MPT_UCHAR('n'), MPT_UCHAR('o'), MPT_UCHAR('p'), MPT_UCHAR('q'), MPT_UCHAR('r'), MPT_UCHAR('s'), MPT_UCHAR('t'), MPT_UCHAR('u'), MPT_UCHAR('v'),
+	 MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('+'), MPT_UCHAR('/')}};
+
+
+template <typename Tbyte>
+inline mpt::ustring encode_base64(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(4 * ((src.size() + 2) / 3));
+	uint32 bits = 0;
+	std::size_t bytes = 0;
+	for (std::byte byte : src) {
+		bits <<= 8;
+		bits |= mpt::byte_cast<uint8>(byte);
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64[(bits >> 18) & 0x3f]);
+			result.push_back(base64[(bits >> 12) & 0x3f]);
+			result.push_back(base64[(bits >> 6) & 0x3f]);
+			result.push_back(base64[(bits >> 0) & 0x3f]);
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	std::size_t padding = 0;
+	while (bytes != 0) {
+		bits <<= 8;
+		padding++;
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64[(bits >> 18) & 0x3f]);
+			result.push_back(base64[(bits >> 12) & 0x3f]);
+			if (padding > 1) {
+				result.push_back(MPT_UCHAR('='));
+			} else {
+				result.push_back(base64[(bits >> 6) & 0x3f]);
+			}
+			if (padding > 0) {
+				result.push_back(MPT_UCHAR('='));
+			} else {
+				result.push_back(base64[(bits >> 0) & 0x3f]);
+			}
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	return result;
+}
+
+inline uint8 decode_base64_bits(mpt::uchar c) {
+	for (uint8 i = 0; i < 64; ++i) {
+		if (base64[i] == c) {
+			return i;
+		}
+	}
+	throw base64_parse_error();
+}
+
+
+inline std::vector<std::byte> decode_base64(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(3 * (src.length() / 4));
+	uint32 bits = 0;
+	std::size_t chars = 0;
+	std::size_t padding = 0;
+	for (mpt::uchar c : src) {
+		bits <<= 6;
+		if (c == MPT_UCHAR('=')) {
+			padding++;
+		} else {
+			bits |= decode_base64_bits(c);
+		}
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			if (padding < 2) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			}
+			if (padding < 1) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			}
+			bits = 0;
+			chars = 0;
+			padding = 0;
+		}
+	}
+	if (chars != 0) {
+		throw base64_parse_error();
+	}
+	return result;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_BASE64_HPP

Property changes on: src/mpt/binary/base64.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/base64url.hpp
===================================================================
--- src/mpt/binary/base64url.hpp	(nonexistent)
+++ src/mpt/binary/base64url.hpp	(working copy)
@@ -0,0 +1,139 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_BASE64URL_HPP
+#define MPT_BINARY_BASE64URL_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class base64url_parse_error : public std::runtime_error {
+public:
+	base64url_parse_error()
+		: std::runtime_error("invalid Base64URL encoding") {
+	}
+};
+
+
+inline constexpr std::array<mpt::uchar, 64> base64url = {
+	{MPT_UCHAR('A'), MPT_UCHAR('B'), MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F'), MPT_UCHAR('G'), MPT_UCHAR('H'), MPT_UCHAR('I'), MPT_UCHAR('J'), MPT_UCHAR('K'), MPT_UCHAR('L'), MPT_UCHAR('M'), MPT_UCHAR('N'), MPT_UCHAR('O'), MPT_UCHAR('P'),
+	 MPT_UCHAR('Q'), MPT_UCHAR('R'), MPT_UCHAR('S'), MPT_UCHAR('T'), MPT_UCHAR('U'), MPT_UCHAR('V'), MPT_UCHAR('W'), MPT_UCHAR('X'), MPT_UCHAR('Y'), MPT_UCHAR('Z'), MPT_UCHAR('a'), MPT_UCHAR('b'), MPT_UCHAR('c'), MPT_UCHAR('d'), MPT_UCHAR('e'), MPT_UCHAR('f'),
+	 MPT_UCHAR('g'), MPT_UCHAR('h'), MPT_UCHAR('i'), MPT_UCHAR('j'), MPT_UCHAR('k'), MPT_UCHAR('l'), MPT_UCHAR('m'), MPT_UCHAR('n'), MPT_UCHAR('o'), MPT_UCHAR('p'), MPT_UCHAR('q'), MPT_UCHAR('r'), MPT_UCHAR('s'), MPT_UCHAR('t'), MPT_UCHAR('u'), MPT_UCHAR('v'),
+	 MPT_UCHAR('w'), MPT_UCHAR('x'), MPT_UCHAR('y'), MPT_UCHAR('z'), MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'), MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'), MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('-'), MPT_UCHAR('_')}};
+
+template <typename Tbyte>
+inline mpt::ustring encode_base64url(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(4 * ((src.size() + 2) / 3));
+	uint32 bits = 0;
+	std::size_t bytes = 0;
+	for (std::byte byte : src) {
+		bits <<= 8;
+		bits |= mpt::byte_cast<uint8>(byte);
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64url[(bits >> 18) & 0x3f]);
+			result.push_back(base64url[(bits >> 12) & 0x3f]);
+			result.push_back(base64url[(bits >> 6) & 0x3f]);
+			result.push_back(base64url[(bits >> 0) & 0x3f]);
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	std::size_t padding = 0;
+	while (bytes != 0) {
+		bits <<= 8;
+		padding++;
+		bytes++;
+		if (bytes == 3) {
+			result.push_back(base64url[(bits >> 18) & 0x3f]);
+			result.push_back(base64url[(bits >> 12) & 0x3f]);
+			if (padding <= 1) {
+				result.push_back(base64url[(bits >> 6) & 0x3f]);
+			}
+			if (padding <= 0) {
+				result.push_back(base64url[(bits >> 0) & 0x3f]);
+			}
+			bits = 0;
+			bytes = 0;
+		}
+	}
+	return result;
+}
+
+inline uint8 decode_base64url_bits(mpt::uchar c) {
+	for (uint8 i = 0; i < 64; ++i)
+	{
+		if (base64url[i] == c)
+		{
+			return i;
+		}
+	}
+	throw base64url_parse_error();
+}
+
+inline std::vector<std::byte> decode_base64url(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(3 * ((src.length() + 2) / 4));
+	uint32 bits = 0;
+	std::size_t chars = 0;
+	for (mpt::uchar c : src) {
+		bits <<= 6;
+		bits |= decode_base64url_bits(c);
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			bits = 0;
+			chars = 0;
+		}
+	}
+	uint32 padding = 0;
+	if (chars != 0 && chars < 2) {
+		throw base64url_parse_error();
+	}
+	while (chars != 0) {
+		bits <<= 6;
+		padding++;
+		chars++;
+		if (chars == 4) {
+			result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 16) & 0xff)));
+			if (padding < 2) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 8) & 0xff)));
+			}
+			if (padding < 1) {
+				result.push_back(mpt::byte_cast<std::byte>(static_cast<uint8>((bits >> 0) & 0xff)));
+			}
+			bits = 0;
+			chars = 0;
+			padding = 0;
+		}
+	}
+	return result;
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_BASE64URL_HPP

Property changes on: src/mpt/binary/base64url.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/hex.hpp
===================================================================
--- src/mpt/binary/hex.hpp	(nonexistent)
+++ src/mpt/binary/hex.hpp	(working copy)
@@ -0,0 +1,88 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BINARY_HEX_HPP
+#define MPT_BINARY_HEX_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline constexpr std::array<mpt::uchar, 16> encode_nibble = {
+	{MPT_UCHAR('0'), MPT_UCHAR('1'), MPT_UCHAR('2'), MPT_UCHAR('3'),
+	 MPT_UCHAR('4'), MPT_UCHAR('5'), MPT_UCHAR('6'), MPT_UCHAR('7'),
+	 MPT_UCHAR('8'), MPT_UCHAR('9'), MPT_UCHAR('A'), MPT_UCHAR('B'),
+	 MPT_UCHAR('C'), MPT_UCHAR('D'), MPT_UCHAR('E'), MPT_UCHAR('F')}};
+
+
+inline bool decode_byte(uint8 & byte, mpt::uchar c1, mpt::uchar c2) {
+	byte = 0;
+	if (MPT_UCHAR('0') <= c1 && c1 <= MPT_UCHAR('9')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('0')) << 4);
+	} else if (MPT_UCHAR('A') <= c1 && c1 <= MPT_UCHAR('F')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('A') + 10) << 4);
+	} else if (MPT_UCHAR('a') <= c1 && c1 <= MPT_UCHAR('f')) {
+		byte += static_cast<uint8>((c1 - MPT_UCHAR('a') + 10) << 4);
+	} else {
+		return false;
+	}
+	if (MPT_UCHAR('0') <= c2 && c2 <= MPT_UCHAR('9')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('0'));
+	} else if (MPT_UCHAR('A') <= c2 && c2 <= MPT_UCHAR('F')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('A') + 10);
+	} else if (MPT_UCHAR('a') <= c2 && c2 <= MPT_UCHAR('f')) {
+		byte += static_cast<uint8>(c2 - MPT_UCHAR('a') + 10);
+	} else {
+		return false;
+	}
+	return true;
+}
+
+
+template <typename Tbyte>
+inline mpt::ustring encode_hex(mpt::span<Tbyte> src_) {
+	mpt::const_byte_span src = mpt::byte_cast<mpt::const_byte_span>(src_);
+	mpt::ustring result;
+	result.reserve(src.size() * 2);
+	for (std::byte byte : src) {
+		result.push_back(encode_nibble[(mpt::byte_cast<uint8>(byte) & 0xf0) >> 4]);
+		result.push_back(encode_nibble[mpt::byte_cast<uint8>(byte) & 0x0f]);
+	}
+	return result;
+}
+
+inline std::vector<std::byte> decode_hex(const mpt::ustring & src) {
+	std::vector<std::byte> result;
+	result.reserve(src.size() / 2);
+	for (std::size_t i = 0; (i + 1) < src.size(); i += 2) {
+		uint8 byte = 0;
+		if (!decode_byte(byte, src[i], src[i + 1])) {
+			return result;
+		}
+		result.push_back(mpt::byte_cast<std::byte>(byte));
+	}
+	return result;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BINARY_HEX_HPP

Property changes on: src/mpt/binary/hex.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/tests/tests_binary.hpp
===================================================================
--- src/mpt/binary/tests/tests_binary.hpp	(nonexistent)
+++ src/mpt/binary/tests/tests_binary.hpp	(working copy)
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_BINARY_HPP
+#define MPT_BASE_TESTS_BINARY_HPP
+
+
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/binary/base64.hpp"
+#include "mpt/binary/base64url.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_binary{
+	"mpt/binary",
+	[](mpt::test::context & context) {
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("cGxlYXN1cmUu"));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("bGVhc3VyZS4="));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("ZWFzdXJlLg=="));
+		}
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("cGxlYXN1cmUu")));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("bGVhc3VyZS4=")));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("ZWFzdXJlLg==")));
+		}
+
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("cGxlYXN1cmUu"));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("bGVhc3VyZS4"));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("ZWFzdXJlLg"));
+		}
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("cGxlYXN1cmUu")));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("bGVhc3VyZS4")));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("ZWFzdXJlLg")));
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_BINARY_HPP

Property changes on: src/mpt/binary/tests/tests_binary.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/binary/tests/tests_binary.hpp
===================================================================
--- src/mpt/binary/tests/tests_binary.hpp	(nonexistent)
+++ src/mpt/binary/tests/tests_binary.hpp	(working copy)
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_BINARY_HPP
+#define MPT_BASE_TESTS_BINARY_HPP
+
+
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/binary/base64.hpp"
+#include "mpt/binary/base64url.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_binary{
+	"mpt/binary",
+	[](mpt::test::context & context) {
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("cGxlYXN1cmUu"));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("bGVhc3VyZS4="));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64(mpt::as_span(expected)), MPT_USTRING("ZWFzdXJlLg=="));
+		}
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("cGxlYXN1cmUu")));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("bGVhc3VyZS4=")));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64(MPT_USTRING("ZWFzdXJlLg==")));
+		}
+
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("cGxlYXN1cmUu"));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("bGVhc3VyZS4"));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(mpt::encode_base64url(mpt::as_span(expected)), MPT_USTRING("ZWFzdXJlLg"));
+		}
+		{
+			std::string expecteds = std::string("pleasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("cGxlYXN1cmUu")));
+		}
+		{
+			std::string expecteds = std::string("leasure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("bGVhc3VyZS4")));
+		}
+		{
+			std::string expecteds = std::string("easure.");
+			std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
+			MPT_TEST_EXPECT_EQUAL(expected, mpt::decode_base64url(MPT_USTRING("ZWFzdXJlLg")));
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_BINARY_HPP

Property changes on: src/mpt/binary/tests/tests_binary.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/libc.hpp
===================================================================
--- src/mpt/check/libc.hpp	(nonexistent)
+++ src/mpt/check/libc.hpp	(working copy)
@@ -0,0 +1,41 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_LIBC_HPP
+#define MPT_CHECK_LIBC_HPP
+
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+#ifndef __STDC_CONSTANT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_CONSTANT_MACROS
+MPT_WARNING("C stdlib does not provide constant macros. Please #define __STDC_CONSTANT_MACROS.")
+#endif
+#endif
+
+#ifndef __STDC_FORMAT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_FORMAT_MACROS
+MPT_WARNING("C stdlib does not provide limit macros. Please #define __STDC_FORMAT_MACROS.")
+#endif
+#endif
+
+#ifndef __STDC_LIMIT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_LIMIT_MACROS
+MPT_WARNING("C stdlib does not provide limit macros. Please #define __STDC_LIMIT_MACROS.")
+#endif
+#endif
+
+#ifndef _USE_MATH_DEFINES
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_USE_MATH_DEFINES
+MPT_WARNING("C stdlib does not provide math constants. Please #define _USE_MATH_DEFINES.")
+#endif
+#endif
+
+#if !MPT_LIBC_MS
+#if !defined(_FILE_OFFSET_BITS)
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_FILE_OFFSET_BITS
+MPT_WARNING("C stdlib may not provide 64bit std::FILE access. Please #define _FILE_OFFSET_BITS=64.")
+#endif
+#endif
+#endif
+
+#endif // MPT_CHECK_LIBC_HPP

Property changes on: src/mpt/check/libc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/mfc.hpp
===================================================================
--- src/mpt/check/mfc.hpp	(nonexistent)
+++ src/mpt/check/mfc.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_MFC_HPP
+#define MPT_CHECK_MFC_HPP
+
+#include "mpt/base/compiletime_warning.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#if MPT_DETECTED_MFC
+
+#ifndef _CSTRING_DISABLE_NARROW_WIDE_CONVERSION
+#ifndef MPT_CHECK_MFC_IGNORE_WARNING_NO_CSTRING_DISABLE_NARROW_WIDE_CONVERSION
+MPT_WARNING("MFC uses CString with automatic encoding conversions. Please #define _CSTRING_DISABLE_NARROW_WIDE_CONVERSION.")
+#endif
+#endif
+
+#endif // MPT_DETECTED_MFC
+
+#endif // MPT_CHECK_MFC_HPP

Property changes on: src/mpt/check/mfc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/windows.hpp
===================================================================
--- src/mpt/check/windows.hpp	(nonexistent)
+++ src/mpt/check/windows.hpp	(working copy)
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_WINDOWS_HPP
+#define MPT_CHECK_WINDOWS_HPP
+
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+#if MPT_OS_WINDOWS
+
+#ifndef UNICODE
+#ifndef MPT_CHECK_WINDOWS_IGNORE_WARNING_NO_UNICODE
+MPT_WARNING("windows.h uses MBCS TCHAR. Please #define UNICODE.")
+#endif
+#endif
+
+#ifndef NOMINMAX
+#ifndef MPT_CHECK_WINDOWS_IGNORE_WARNING_NO_NOMINMAX
+MPT_WARNING("windows.h defines min and max which conflicts with C++. Please #define NOMINMAX.")
+#endif
+#endif
+
+#endif // MPT_OS_WINDOWS
+
+#endif // MPT_CHECK_WINDOWS_HPP

Property changes on: src/mpt/check/windows.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/libc.hpp
===================================================================
--- src/mpt/check/libc.hpp	(nonexistent)
+++ src/mpt/check/libc.hpp	(working copy)
@@ -0,0 +1,41 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_LIBC_HPP
+#define MPT_CHECK_LIBC_HPP
+
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+#ifndef __STDC_CONSTANT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_CONSTANT_MACROS
+MPT_WARNING("C stdlib does not provide constant macros. Please #define __STDC_CONSTANT_MACROS.")
+#endif
+#endif
+
+#ifndef __STDC_FORMAT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_FORMAT_MACROS
+MPT_WARNING("C stdlib does not provide limit macros. Please #define __STDC_FORMAT_MACROS.")
+#endif
+#endif
+
+#ifndef __STDC_LIMIT_MACROS
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_STDC_LIMIT_MACROS
+MPT_WARNING("C stdlib does not provide limit macros. Please #define __STDC_LIMIT_MACROS.")
+#endif
+#endif
+
+#ifndef _USE_MATH_DEFINES
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_USE_MATH_DEFINES
+MPT_WARNING("C stdlib does not provide math constants. Please #define _USE_MATH_DEFINES.")
+#endif
+#endif
+
+#if !MPT_LIBC_MS
+#if !defined(_FILE_OFFSET_BITS)
+#ifndef MPT_CHECK_LIBC_IGNORE_WARNING_NO_FILE_OFFSET_BITS
+MPT_WARNING("C stdlib may not provide 64bit std::FILE access. Please #define _FILE_OFFSET_BITS=64.")
+#endif
+#endif
+#endif
+
+#endif // MPT_CHECK_LIBC_HPP

Property changes on: src/mpt/check/libc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/mfc.hpp
===================================================================
--- src/mpt/check/mfc.hpp	(nonexistent)
+++ src/mpt/check/mfc.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_MFC_HPP
+#define MPT_CHECK_MFC_HPP
+
+#include "mpt/base/compiletime_warning.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#if MPT_DETECTED_MFC
+
+#ifndef _CSTRING_DISABLE_NARROW_WIDE_CONVERSION
+#ifndef MPT_CHECK_MFC_IGNORE_WARNING_NO_CSTRING_DISABLE_NARROW_WIDE_CONVERSION
+MPT_WARNING("MFC uses CString with automatic encoding conversions. Please #define _CSTRING_DISABLE_NARROW_WIDE_CONVERSION.")
+#endif
+#endif
+
+#endif // MPT_DETECTED_MFC
+
+#endif // MPT_CHECK_MFC_HPP

Property changes on: src/mpt/check/mfc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/check/windows.hpp
===================================================================
--- src/mpt/check/windows.hpp	(nonexistent)
+++ src/mpt/check/windows.hpp	(working copy)
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CHECK_WINDOWS_HPP
+#define MPT_CHECK_WINDOWS_HPP
+
+#include "mpt/base/detect_os.hpp"
+#include "mpt/base/compiletime_warning.hpp"
+
+#if MPT_OS_WINDOWS
+
+#ifndef UNICODE
+#ifndef MPT_CHECK_WINDOWS_IGNORE_WARNING_NO_UNICODE
+MPT_WARNING("windows.h uses MBCS TCHAR. Please #define UNICODE.")
+#endif
+#endif
+
+#ifndef NOMINMAX
+#ifndef MPT_CHECK_WINDOWS_IGNORE_WARNING_NO_NOMINMAX
+MPT_WARNING("windows.h defines min and max which conflicts with C++. Please #define NOMINMAX.")
+#endif
+#endif
+
+#endif // MPT_OS_WINDOWS
+
+#endif // MPT_CHECK_WINDOWS_HPP

Property changes on: src/mpt/check/windows.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crc/crc.hpp
===================================================================
--- src/mpt/crc/crc.hpp	(nonexistent)
+++ src/mpt/crc/crc.hpp	(working copy)
@@ -0,0 +1,205 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRC_CRC_HPP
+#define MPT_CRC_CRC_HPP
+
+
+
+#include "mpt/base/array.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+
+#include <array>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T, T polynomial, T initial, T resultXOR, bool reverseData>
+class crc {
+
+public:
+	using self_type = crc;
+	using value_type = T;
+	using byte_type = uint8;
+
+	static constexpr std::size_t size_bytes = sizeof(value_type);
+	static constexpr std::size_t size_bits = sizeof(value_type) * 8;
+	static constexpr value_type top_bit = static_cast<value_type>(1) << ((sizeof(value_type) * 8) - 1);
+
+private:
+	template <typename Tint>
+	static constexpr Tint reverse(Tint value) noexcept {
+		const std::size_t bits = sizeof(Tint) * 8;
+		Tint result = 0;
+		for (std::size_t i = 0; i < bits; ++i) {
+			result <<= 1;
+			result |= static_cast<Tint>(value & 0x1);
+			value >>= 1;
+		}
+		return result;
+	}
+
+	static constexpr value_type calculate_table_entry(byte_type pos) noexcept {
+		value_type value = 0;
+		value = (static_cast<value_type>(reverseData ? reverse(pos) : pos) << (size_bits - 8));
+		for (std::size_t bit = 0; bit < 8; ++bit) {
+			if (value & top_bit) {
+				value = (value << 1) ^ polynomial;
+			} else {
+				value = (value << 1);
+			}
+		}
+		value = (reverseData ? reverse(value) : value);
+		return value;
+	}
+
+private:
+	static constexpr std::array<value_type, 256> calculate_table() noexcept {
+		std::array<value_type, 256> t = mpt::init_array<value_type, 256>(value_type{});
+		for (std::size_t i = 0; i < 256; ++i) {
+			t[i] = calculate_table_entry(static_cast<byte_type>(i));
+		}
+		return t;
+	}
+
+	static constexpr std::array<value_type, 256> table = calculate_table();
+
+private:
+	constexpr value_type read_table(byte_type pos) const noexcept {
+		return table[pos];
+	}
+
+private:
+	value_type value;
+
+public:
+	constexpr crc() noexcept
+		: value(initial) {
+		return;
+	}
+
+	constexpr void processByte(byte_type byte) noexcept {
+		if constexpr (reverseData) {
+			value = (value >> 8) ^ read_table(static_cast<byte_type>((value & 0xff) ^ byte));
+		} else {
+			value = (value << 8) ^ read_table(static_cast<byte_type>(((value >> (size_bits - 8)) & 0xff) ^ byte));
+		}
+	}
+
+	constexpr value_type result() const noexcept {
+		return (value ^ resultXOR);
+	}
+
+public:
+	constexpr operator value_type() const noexcept {
+		return result();
+	}
+
+	inline crc & process(char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(signed char c) noexcept {
+		processByte(static_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(unsigned char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(std::byte c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	template <typename InputIt>
+	inline crc & process(InputIt beg, InputIt end) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			process(*it);
+		}
+		return *this;
+	}
+
+	template <typename Container>
+	inline crc & process(const Container & data) {
+		operator()(data.begin(), data.end());
+		return *this;
+	}
+
+	inline crc & operator()(char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(signed char c) noexcept {
+		processByte(static_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(unsigned char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(std::byte c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	template <typename InputIt>
+	crc & operator()(InputIt beg, InputIt end) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			operator()(*it);
+		}
+		return *this;
+	}
+
+	template <typename Container>
+	inline crc & operator()(const Container & data) {
+		operator()(data.begin(), data.end());
+		return *this;
+	}
+
+	template <typename InputIt>
+	crc(InputIt beg, InputIt end)
+		: value(initial) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			process(*it);
+		}
+	}
+
+	template <typename Container>
+	inline crc(const Container & data)
+		: value(initial) {
+		process(data.begin(), data.end());
+	}
+};
+
+using crc16 = crc<uint16, 0x8005, 0, 0, true>;
+using crc32 = crc<uint32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true>;
+using crc32_ogg = crc<uint32, 0x04C11DB7, 0, 0, false>;
+using crc32c = crc<uint32, 0x1EDC6F41, 0xFFFFFFFF, 0xFFFFFFFF, true>;
+using crc64_jones = crc<uint64, 0xAD93D23594C935A9ull, 0xFFFFFFFFFFFFFFFFull, 0, true>;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRC_CRC_HPP

Property changes on: src/mpt/crc/crc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crc/tests/tests_crc.hpp
===================================================================
--- src/mpt/crc/tests/tests_crc.hpp	(nonexistent)
+++ src/mpt/crc/tests/tests_crc.hpp	(working copy)
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_CRC_HPP
+#define MPT_BASE_TESTS_CRC_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/crc/crc.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_crc{
+	"mpt/crc",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::crc32(std::string("123456789")), 0xCBF43926u);
+		MPT_TEST_EXPECT_EQUAL(mpt::crc32_ogg(std::string("123456789")), 0x89a1897fu);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_CRC_HPP

Property changes on: src/mpt/crc/tests/tests_crc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crc/crc.hpp
===================================================================
--- src/mpt/crc/crc.hpp	(nonexistent)
+++ src/mpt/crc/crc.hpp	(working copy)
@@ -0,0 +1,205 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRC_CRC_HPP
+#define MPT_CRC_CRC_HPP
+
+
+
+#include "mpt/base/array.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+
+#include <array>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T, T polynomial, T initial, T resultXOR, bool reverseData>
+class crc {
+
+public:
+	using self_type = crc;
+	using value_type = T;
+	using byte_type = uint8;
+
+	static constexpr std::size_t size_bytes = sizeof(value_type);
+	static constexpr std::size_t size_bits = sizeof(value_type) * 8;
+	static constexpr value_type top_bit = static_cast<value_type>(1) << ((sizeof(value_type) * 8) - 1);
+
+private:
+	template <typename Tint>
+	static constexpr Tint reverse(Tint value) noexcept {
+		const std::size_t bits = sizeof(Tint) * 8;
+		Tint result = 0;
+		for (std::size_t i = 0; i < bits; ++i) {
+			result <<= 1;
+			result |= static_cast<Tint>(value & 0x1);
+			value >>= 1;
+		}
+		return result;
+	}
+
+	static constexpr value_type calculate_table_entry(byte_type pos) noexcept {
+		value_type value = 0;
+		value = (static_cast<value_type>(reverseData ? reverse(pos) : pos) << (size_bits - 8));
+		for (std::size_t bit = 0; bit < 8; ++bit) {
+			if (value & top_bit) {
+				value = (value << 1) ^ polynomial;
+			} else {
+				value = (value << 1);
+			}
+		}
+		value = (reverseData ? reverse(value) : value);
+		return value;
+	}
+
+private:
+	static constexpr std::array<value_type, 256> calculate_table() noexcept {
+		std::array<value_type, 256> t = mpt::init_array<value_type, 256>(value_type{});
+		for (std::size_t i = 0; i < 256; ++i) {
+			t[i] = calculate_table_entry(static_cast<byte_type>(i));
+		}
+		return t;
+	}
+
+	static constexpr std::array<value_type, 256> table = calculate_table();
+
+private:
+	constexpr value_type read_table(byte_type pos) const noexcept {
+		return table[pos];
+	}
+
+private:
+	value_type value;
+
+public:
+	constexpr crc() noexcept
+		: value(initial) {
+		return;
+	}
+
+	constexpr void processByte(byte_type byte) noexcept {
+		if constexpr (reverseData) {
+			value = (value >> 8) ^ read_table(static_cast<byte_type>((value & 0xff) ^ byte));
+		} else {
+			value = (value << 8) ^ read_table(static_cast<byte_type>(((value >> (size_bits - 8)) & 0xff) ^ byte));
+		}
+	}
+
+	constexpr value_type result() const noexcept {
+		return (value ^ resultXOR);
+	}
+
+public:
+	constexpr operator value_type() const noexcept {
+		return result();
+	}
+
+	inline crc & process(char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(signed char c) noexcept {
+		processByte(static_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(unsigned char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & process(std::byte c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	template <typename InputIt>
+	inline crc & process(InputIt beg, InputIt end) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			process(*it);
+		}
+		return *this;
+	}
+
+	template <typename Container>
+	inline crc & process(const Container & data) {
+		operator()(data.begin(), data.end());
+		return *this;
+	}
+
+	inline crc & operator()(char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(signed char c) noexcept {
+		processByte(static_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(unsigned char c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	inline crc & operator()(std::byte c) noexcept {
+		processByte(mpt::byte_cast<byte_type>(c));
+		return *this;
+	}
+
+	template <typename InputIt>
+	crc & operator()(InputIt beg, InputIt end) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			operator()(*it);
+		}
+		return *this;
+	}
+
+	template <typename Container>
+	inline crc & operator()(const Container & data) {
+		operator()(data.begin(), data.end());
+		return *this;
+	}
+
+	template <typename InputIt>
+	crc(InputIt beg, InputIt end)
+		: value(initial) {
+		for (InputIt it = beg; it != end; ++it) {
+			static_assert(sizeof(*it) == 1, "1 byte type required");
+			process(*it);
+		}
+	}
+
+	template <typename Container>
+	inline crc(const Container & data)
+		: value(initial) {
+		process(data.begin(), data.end());
+	}
+};
+
+using crc16 = crc<uint16, 0x8005, 0, 0, true>;
+using crc32 = crc<uint32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true>;
+using crc32_ogg = crc<uint32, 0x04C11DB7, 0, 0, false>;
+using crc32c = crc<uint32, 0x1EDC6F41, 0xFFFFFFFF, 0xFFFFFFFF, true>;
+using crc64_jones = crc<uint64, 0xAD93D23594C935A9ull, 0xFFFFFFFFFFFFFFFFull, 0, true>;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRC_CRC_HPP

Property changes on: src/mpt/crc/crc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crc/tests/tests_crc.hpp
===================================================================
--- src/mpt/crc/tests/tests_crc.hpp	(nonexistent)
+++ src/mpt/crc/tests/tests_crc.hpp	(working copy)
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_CRC_HPP
+#define MPT_BASE_TESTS_CRC_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/crc/crc.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_crc{
+	"mpt/crc",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::crc32(std::string("123456789")), 0xCBF43926u);
+		MPT_TEST_EXPECT_EQUAL(mpt::crc32_ogg(std::string("123456789")), 0x89a1897fu);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_CRC_HPP

Property changes on: src/mpt/crc/tests/tests_crc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crc/tests/tests_crc.hpp
===================================================================
--- src/mpt/crc/tests/tests_crc.hpp	(nonexistent)
+++ src/mpt/crc/tests/tests_crc.hpp	(working copy)
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_CRC_HPP
+#define MPT_BASE_TESTS_CRC_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/crc/crc.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_crc{
+	"mpt/crc",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::crc32(std::string("123456789")), 0xCBF43926u);
+		MPT_TEST_EXPECT_EQUAL(mpt::crc32_ogg(std::string("123456789")), 0x89a1897fu);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_CRC_HPP

Property changes on: src/mpt/crc/tests/tests_crc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/exception.hpp
===================================================================
--- src/mpt/crypto/exception.hpp	(nonexistent)
+++ src/mpt/crypto/exception.hpp	(working copy)
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_EXCEPTION_HPP
+#define MPT_CRYPTO_EXCEPTION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+
+#include <stdexcept>
+
+#if MPT_OS_WINDOWS
+#include <ncrypt.h>
+#include <wincrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS
+
+class exception
+	: public std::runtime_error {
+private:
+	NTSTATUS m_Status;
+
+public:
+	exception(NTSTATUS status)
+		: std::runtime_error("crypto error")
+		, m_Status(status) {
+		return;
+	}
+
+public:
+	NTSTATUS code() const noexcept {
+		return m_Status;
+	}
+};
+
+
+class security_exception
+	: public std::runtime_error {
+private:
+	SECURITY_STATUS m_Status;
+
+public:
+	security_exception(SECURITY_STATUS status)
+		: std::runtime_error("crypto error")
+		, m_Status(status) {
+		return;
+	}
+
+public:
+	SECURITY_STATUS code() const noexcept {
+		return m_Status;
+	}
+};
+
+
+inline void CheckNTSTATUS(NTSTATUS status) {
+	if (status >= 0) {
+		return;
+	} else if (status == STATUS_NO_MEMORY) {
+		mpt::throw_out_of_memory();
+	} else {
+		throw exception(status);
+	}
+}
+
+
+inline void CheckSECURITY_STATUS(SECURITY_STATUS status) {
+	if (status == ERROR_SUCCESS) {
+		return;
+	} else if (status == NTE_NO_MEMORY) {
+		mpt::throw_out_of_memory();
+	} else {
+		throw security_exception(status);
+	}
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace crypto
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_EXCEPTION_HPP

Property changes on: src/mpt/crypto/exception.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/hash.hpp
===================================================================
--- src/mpt/crypto/hash.hpp	(nonexistent)
+++ src/mpt/crypto/hash.hpp	(working copy)
@@ -0,0 +1,180 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_HASH_HPP
+#define MPT_CRYPTO_HASH_HPP
+
+
+
+#include "mpt/base/array.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/crypto/exception.hpp"
+
+#include <algorithm>
+#include <vector>
+
+#include <cassert>
+#include <cstddef>
+
+#if MPT_OS_WINDOWS
+#include <bcrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+namespace hash {
+
+
+struct hash_traits_md5 {
+	static constexpr std::size_t output_bits = 128;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_MD5_ALGORITHM;
+};
+
+struct hash_traits_sha1 {
+	static constexpr std::size_t output_bits = 160;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA1_ALGORITHM;
+};
+
+struct hash_traits_sha256 {
+	static constexpr std::size_t output_bits = 256;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA256_ALGORITHM;
+};
+
+struct hash_traits_sha512 {
+	static constexpr std::size_t output_bits = 512;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA512_ALGORITHM;
+};
+
+template <typename Traits>
+class hash_impl {
+
+public:
+	using traits = Traits;
+
+	using result_type = std::array<std::byte, traits::output_bytes>;
+
+private:
+	BCRYPT_ALG_HANDLE hAlg = NULL;
+	std::vector<BYTE> hashState;
+	std::vector<BYTE> hashResult;
+	BCRYPT_HASH_HANDLE hHash = NULL;
+
+private:
+	void init() {
+		CheckNTSTATUS(BCryptOpenAlgorithmProvider(&hAlg, traits::bcrypt_name, NULL, 0));
+		if (!hAlg) {
+			throw exception(0);
+		}
+		DWORD hashStateSize = 0;
+		DWORD hashStateSizeSize = 0;
+		CheckNTSTATUS(BCryptGetProperty(hAlg, BCRYPT_OBJECT_LENGTH, (PBYTE)&hashStateSize, sizeof(DWORD), &hashStateSizeSize, 0));
+		if (hashStateSizeSize != sizeof(DWORD)) {
+			throw exception(0);
+		}
+		if (hashStateSize <= 0) {
+			throw exception(0);
+		}
+		hashState.resize(hashStateSize);
+		DWORD hashResultSize = 0;
+		DWORD hashResultSizeSize = 0;
+		CheckNTSTATUS(BCryptGetProperty(hAlg, BCRYPT_HASH_LENGTH, (PBYTE)&hashResultSize, sizeof(DWORD), &hashResultSizeSize, 0));
+		if (hashResultSizeSize != sizeof(DWORD)) {
+			throw exception(0);
+		}
+		if (hashResultSize <= 0) {
+			throw exception(0);
+		}
+		if (hashResultSize != mpt::extent<result_type>()) {
+			throw exception(0);
+		}
+		hashResult.resize(hashResultSize);
+		CheckNTSTATUS(BCryptCreateHash(hAlg, &hHash, hashState.data(), hashStateSize, NULL, 0, 0));
+		if (!hHash) {
+			throw exception(0);
+		}
+	}
+
+	void cleanup() {
+		if (hHash) {
+			BCryptDestroyHash(hHash);
+			hHash = NULL;
+		}
+		hashResult.resize(0);
+		hashResult.shrink_to_fit();
+		hashState.resize(0);
+		hashState.shrink_to_fit();
+		if (hAlg) {
+			BCryptCloseAlgorithmProvider(hAlg, 0);
+			hAlg = NULL;
+		}
+	}
+
+public:
+	hash_impl() {
+		try {
+			init();
+		} catch (...) {
+			cleanup();
+			throw;
+		}
+	}
+	hash_impl(const hash_impl &) = delete;
+	hash_impl & operator=(const hash_impl &) = delete;
+	~hash_impl() {
+		cleanup();
+	}
+
+public:
+	hash_impl & process(mpt::const_byte_span data) {
+		CheckNTSTATUS(BCryptHashData(hHash, const_cast<UCHAR *>(mpt::byte_cast<const UCHAR *>(data.data())), mpt::saturate_cast<ULONG>(data.size()), 0));
+		return *this;
+	}
+
+	result_type result() {
+		result_type res = mpt::init_array<std::byte, traits::output_bytes>(std::byte{0});
+		CheckNTSTATUS(BCryptFinishHash(hHash, hashResult.data(), mpt::saturate_cast<ULONG>(hashResult.size()), 0));
+		assert(hashResult.size() == mpt::extent<result_type>());
+		std::transform(hashResult.begin(), hashResult.end(), res.begin(), [](BYTE b) { return mpt::as_byte(b); });
+		return res;
+	}
+};
+
+using MD5 = hash_impl<hash_traits_md5>;
+using SHA1 = hash_impl<hash_traits_sha1>;
+using SHA256 = hash_impl<hash_traits_sha256>;
+using SHA512 = hash_impl<hash_traits_sha512>;
+
+
+} // namespace hash
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace crypto
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_HASH_HPP

Property changes on: src/mpt/crypto/hash.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/jwk.hpp
===================================================================
--- src/mpt/crypto/jwk.hpp	(nonexistent)
+++ src/mpt/crypto/jwk.hpp	(working copy)
@@ -0,0 +1,532 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_JWK_HPP
+#define MPT_CRYPTO_JWK_HPP
+
+
+
+#include "mpt/base/alloc.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/binary/base64url.hpp"
+#include "mpt/crypto/exception.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+#include "mpt/json/json.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <algorithm>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include <cassert>
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+
+#if MPT_OS_WINDOWS
+#include <bcrypt.h>
+#include <ncrypt.h>
+#include <wincrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+
+
+class keystore {
+public:
+	enum class domain
+	{
+		system = 1,
+		user = 2,
+	};
+
+private:
+	NCRYPT_PROV_HANDLE hProv = NULL;
+	domain ProvDomain = domain::user;
+
+private:
+	void cleanup() {
+		if (hProv) {
+			NCryptFreeObject(hProv);
+			hProv = NULL;
+		}
+	}
+
+public:
+	keystore(domain d)
+		: ProvDomain(d) {
+		try {
+			CheckSECURITY_STATUS(NCryptOpenStorageProvider(&hProv, MS_KEY_STORAGE_PROVIDER, 0));
+		} catch (...) {
+			cleanup();
+			throw;
+		}
+	}
+	~keystore() {
+		return;
+	}
+	operator NCRYPT_PROV_HANDLE() {
+		return hProv;
+	}
+	keystore::domain store_domain() const {
+		return ProvDomain;
+	}
+};
+
+
+
+namespace asymmetric {
+
+
+
+class signature_verification_failed
+	: public std::runtime_error {
+public:
+	signature_verification_failed()
+		: std::runtime_error("Signature Verification failed.") {
+		return;
+	}
+};
+
+
+
+inline std::vector<mpt::ustring> jws_get_keynames(const mpt::ustring & jws_) {
+	std::vector<mpt::ustring> result;
+	nlohmann::json jws = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jws_));
+	for (const auto & s : jws["signatures"]) {
+		result.push_back(s["header"]["kid"]);
+	}
+	return result;
+}
+
+
+
+struct RSASSA_PSS_SHA512_traits {
+	using hash_type = mpt::crypto::hash::SHA512;
+	static constexpr const char * jwk_alg = "PS512";
+};
+
+
+
+template <typename Traits = RSASSA_PSS_SHA512_traits, std::size_t keysize = 4096>
+class rsassa_pss {
+
+public:
+	using hash_type = typename Traits::hash_type;
+	static constexpr const char * jwk_alg = Traits::jwk_alg;
+
+	struct public_key_data {
+
+		mpt::ustring name;
+		uint32 length = 0;
+		std::vector<std::byte> public_exp;
+		std::vector<std::byte> modulus;
+
+		std::vector<std::byte> as_cng_blob() const {
+			BCRYPT_RSAKEY_BLOB rsakey_blob{};
+			rsakey_blob.Magic = BCRYPT_RSAPUBLIC_MAGIC;
+			rsakey_blob.BitLength = length;
+			rsakey_blob.cbPublicExp = mpt::saturate_cast<ULONG>(public_exp.size());
+			rsakey_blob.cbModulus = mpt::saturate_cast<ULONG>(modulus.size());
+			std::vector<std::byte> result(sizeof(BCRYPT_RSAKEY_BLOB) + public_exp.size() + modulus.size());
+			std::memcpy(result.data(), &rsakey_blob, sizeof(BCRYPT_RSAKEY_BLOB));
+			std::memcpy(result.data() + sizeof(BCRYPT_RSAKEY_BLOB), public_exp.data(), public_exp.size());
+			std::memcpy(result.data() + sizeof(BCRYPT_RSAKEY_BLOB) + public_exp.size(), modulus.data(), modulus.size());
+			return result;
+		}
+
+		mpt::ustring as_jwk() const {
+			nlohmann::json json = nlohmann::json::object();
+			json["kid"] = name;
+			json["kty"] = "RSA";
+			json["alg"] = jwk_alg;
+			json["use"] = "sig";
+			json["e"] = mpt::encode_base64url(mpt::as_span(public_exp));
+			json["n"] = mpt::encode_base64url(mpt::as_span(modulus));
+			return mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, json.dump());
+		}
+
+		static public_key_data from_jwk(const mpt::ustring & jwk) {
+			public_key_data result;
+			try {
+				nlohmann::json json = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jwk));
+				if (json["kty"] != "RSA") {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				if (json["alg"] != jwk_alg) {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				if (json["use"] != "sig") {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				result.name = json["kid"].get<mpt::ustring>();
+				result.public_exp = mpt::decode_base64url(json["e"]);
+				result.modulus = mpt::decode_base64url(json["n"]);
+				result.length = mpt::saturate_cast<uint32>(result.modulus.size() * 8);
+			} catch (mpt::out_of_memory e) {
+				mpt::rethrow_out_of_memory(e);
+			} catch (...) {
+				throw std::runtime_error("Cannot parse RSA public key JWK.");
+			}
+			return result;
+		}
+
+		static public_key_data from_cng_blob(const mpt::ustring & name, const std::vector<std::byte> & blob) {
+			public_key_data result;
+			BCRYPT_RSAKEY_BLOB rsakey_blob{};
+			if (blob.size() < sizeof(BCRYPT_RSAKEY_BLOB)) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			std::memcpy(&rsakey_blob, blob.data(), sizeof(BCRYPT_RSAKEY_BLOB));
+			if (rsakey_blob.Magic != BCRYPT_RSAPUBLIC_MAGIC) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			if (blob.size() != sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp + rsakey_blob.cbModulus) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			result.name = name;
+			result.length = rsakey_blob.BitLength;
+			result.public_exp = std::vector<std::byte>(blob.data() + sizeof(BCRYPT_RSAKEY_BLOB), blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp);
+			result.modulus = std::vector<std::byte>(blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp, blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp + rsakey_blob.cbModulus);
+			return result;
+		}
+	};
+
+
+
+	static std::vector<public_key_data> parse_jwk_set(const mpt::ustring & jwk_set_) {
+		std::vector<public_key_data> result;
+		nlohmann::json jwk_set = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jwk_set_));
+		for (const auto & k : jwk_set["keys"]) {
+			try {
+				result.push_back(public_key_data::from_jwk(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, k.dump())));
+			} catch (...) {
+				// nothing
+			}
+		}
+		return result;
+	}
+
+
+
+	class public_key {
+
+	private:
+		mpt::ustring name;
+		BCRYPT_ALG_HANDLE hSignAlg = NULL;
+		BCRYPT_KEY_HANDLE hKey = NULL;
+
+	private:
+		void cleanup() {
+			if (hKey) {
+				BCryptDestroyKey(hKey);
+				hKey = NULL;
+			}
+			if (hSignAlg) {
+				BCryptCloseAlgorithmProvider(hSignAlg, 0);
+				hSignAlg = NULL;
+			}
+		}
+
+	public:
+		public_key(const public_key_data & data) {
+			try {
+				name = data.name;
+				CheckNTSTATUS(BCryptOpenAlgorithmProvider(&hSignAlg, BCRYPT_RSA_ALGORITHM, NULL, 0));
+				std::vector<std::byte> blob = data.as_cng_blob();
+				CheckNTSTATUS(BCryptImportKeyPair(hSignAlg, NULL, BCRYPT_RSAPUBLIC_BLOB, &hKey, mpt::byte_cast<UCHAR *>(blob.data()), mpt::saturate_cast<ULONG>(blob.size()), 0));
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		public_key(const public_key & other)
+			: public_key(other.get_public_key_data()) {
+			return;
+		}
+
+		public_key & operator=(const public_key & other) {
+			if (&other == this) {
+				return *this;
+			}
+			public_key copy(other);
+			{
+				using std::swap;
+				swap(copy.name, name);
+				swap(copy.hSignAlg, hSignAlg);
+				swap(copy.hKey, hKey);
+			}
+			return *this;
+		}
+
+		~public_key() {
+			cleanup();
+		}
+
+		mpt::ustring get_name() const {
+			return name;
+		}
+
+		public_key_data get_public_key_data() const {
+			DWORD bytes = 0;
+			CheckNTSTATUS(BCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, 0, &bytes, 0));
+			std::vector<std::byte> blob(bytes);
+			CheckNTSTATUS(BCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, mpt::byte_cast<BYTE *>(blob.data()), mpt::saturate_cast<DWORD>(blob.size()), &bytes, 0));
+			return public_key_data::from_cng_blob(name, blob);
+		}
+
+		void verify_hash(typename hash_type::result_type hash, std::vector<std::byte> signature) {
+			BCRYPT_PSS_PADDING_INFO paddinginfo;
+			paddinginfo.pszAlgId = hash_type::traits::bcrypt_name;
+			paddinginfo.cbSalt = mpt::saturate_cast<ULONG>(hash_type::traits::output_bytes);
+			NTSTATUS result = BCryptVerifySignature(hKey, &paddinginfo, mpt::byte_cast<UCHAR *>(hash.data()), mpt::saturate_cast<ULONG>(hash.size()), mpt::byte_cast<UCHAR *>(signature.data()), mpt::saturate_cast<ULONG>(signature.size()), BCRYPT_PAD_PSS);
+			if (result == 0x00000000 /*STATUS_SUCCESS*/) {
+				return;
+			}
+			if (result == 0xC000A000 /*STATUS_INVALID_SIGNATURE*/) {
+				throw signature_verification_failed();
+			}
+			CheckNTSTATUS(result);
+			throw signature_verification_failed();
+		}
+
+		void verify(mpt::const_byte_span payload, const std::vector<std::byte> & signature) {
+			verify_hash(hash_type().process(payload).result(), signature);
+		}
+
+		std::vector<std::byte> jws_verify(const mpt::ustring & jws_) {
+			nlohmann::json jws = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jws_));
+			std::vector<std::byte> payload = mpt::decode_base64url(jws["payload"]);
+			nlohmann::json jsignature = nlohmann::json::object();
+			bool sigfound = false;
+			for (const auto & s : jws["signatures"]) {
+				if (s["header"]["kid"] == mpt::convert<std::string>(mpt::common_encoding::utf8, name)) {
+					jsignature = s;
+					sigfound = true;
+				}
+			}
+			if (!sigfound) {
+				throw signature_verification_failed();
+			}
+			std::vector<std::byte> protectedheaderraw = mpt::decode_base64url(jsignature["protected"]);
+			std::vector<std::byte> signature = mpt::decode_base64url(jsignature["signature"]);
+			nlohmann::json header = nlohmann::json::parse(mpt::buffer_cast<std::string>(protectedheaderraw));
+			if (header["typ"] != "JWT") {
+				throw signature_verification_failed();
+			}
+			if (header["alg"] != jwk_alg) {
+				throw signature_verification_failed();
+			}
+			verify_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderraw)) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(payload)))))).result(), signature);
+			return payload;
+		}
+
+		std::vector<std::byte> jws_compact_verify(const mpt::ustring & jws) {
+			std::vector<mpt::ustring> parts = mpt::split<mpt::ustring>(jws, MPT_USTRING("."));
+			if (parts.size() != 3) {
+				throw signature_verification_failed();
+			}
+			std::vector<std::byte> protectedheaderraw = mpt::decode_base64url(parts[0]);
+			std::vector<std::byte> payload = mpt::decode_base64url(parts[1]);
+			std::vector<std::byte> signature = mpt::decode_base64url(parts[2]);
+			nlohmann::json header = nlohmann::json::parse(mpt::buffer_cast<std::string>(protectedheaderraw));
+			if (header["typ"] != "JWT") {
+				throw signature_verification_failed();
+			}
+			if (header["alg"] != jwk_alg) {
+				throw signature_verification_failed();
+			}
+			verify_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderraw)) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(payload)))))).result(), signature);
+			return payload;
+		}
+	};
+
+
+
+	static inline void jws_verify_at_least_one(std::vector<public_key> & keys, const std::vector<std::byte> & expectedPayload, const mpt::ustring & signature) {
+		std::vector<mpt::ustring> keynames = mpt::crypto::asymmetric::jws_get_keynames(signature);
+		bool sigchecked = false;
+		for (const auto & keyname : keynames) {
+			for (auto & key : keys) {
+				if (key.get_name() == keyname) {
+					if (expectedPayload != key.jws_verify(signature)) {
+						throw mpt::crypto::asymmetric::signature_verification_failed();
+					}
+					sigchecked = true;
+				}
+			}
+		}
+		if (!sigchecked) {
+			throw mpt::crypto::asymmetric::signature_verification_failed();
+		}
+	}
+
+
+
+	static inline std::vector<std::byte> jws_verify_at_least_one(std::vector<public_key> & keys, const mpt::ustring & signature) {
+		std::vector<mpt::ustring> keynames = mpt::crypto::asymmetric::jws_get_keynames(signature);
+		for (const auto & keyname : keynames) {
+			for (auto & key : keys) {
+				if (key.get_name() == keyname) {
+					return key.jws_verify(signature);
+				}
+			}
+		}
+		throw mpt::crypto::asymmetric::signature_verification_failed();
+	}
+
+
+
+	class managed_private_key {
+
+	private:
+		mpt::ustring name;
+		NCRYPT_KEY_HANDLE hKey = NULL;
+
+	private:
+		void cleanup() {
+			if (hKey) {
+				NCryptFreeObject(hKey);
+				hKey = NULL;
+			}
+		}
+
+	public:
+		managed_private_key() = delete;
+
+		managed_private_key(const managed_private_key &) = delete;
+
+		managed_private_key & operator=(const managed_private_key &) = delete;
+
+		managed_private_key(keystore & keystore) {
+			try {
+				CheckSECURITY_STATUS(NCryptCreatePersistedKey(keystore, &hKey, BCRYPT_RSA_ALGORITHM, NULL, 0, 0));
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		managed_private_key(keystore & keystore, const mpt::ustring & name_)
+			: name(name_) {
+			try {
+				SECURITY_STATUS openKeyStatus = NCryptOpenKey(keystore, &hKey, mpt::convert<std::wstring>(name).c_str(), 0, (keystore.store_domain() == keystore::domain::system ? NCRYPT_MACHINE_KEY_FLAG : 0));
+				if (openKeyStatus == NTE_BAD_KEYSET) {
+					CheckSECURITY_STATUS(NCryptCreatePersistedKey(keystore, &hKey, BCRYPT_RSA_ALGORITHM, mpt::convert<std::wstring>(name).c_str(), 0, (keystore.store_domain() == keystore::domain::system ? NCRYPT_MACHINE_KEY_FLAG : 0)));
+					DWORD length = mpt::saturate_cast<DWORD>(keysize);
+					CheckSECURITY_STATUS(NCryptSetProperty(hKey, NCRYPT_LENGTH_PROPERTY, (PBYTE)&length, mpt::saturate_cast<DWORD>(sizeof(DWORD)), 0));
+					CheckSECURITY_STATUS(NCryptFinalizeKey(hKey, 0));
+				} else {
+					CheckSECURITY_STATUS(openKeyStatus);
+				}
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		~managed_private_key() {
+			cleanup();
+		}
+
+		void destroy() {
+			CheckSECURITY_STATUS(NCryptDeleteKey(hKey, 0));
+			name = mpt::ustring();
+			hKey = NULL;
+		}
+
+	public:
+		public_key_data get_public_key_data() const {
+			DWORD bytes = 0;
+			CheckSECURITY_STATUS(NCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, NULL, 0, &bytes, 0));
+			std::vector<std::byte> blob(bytes);
+			CheckSECURITY_STATUS(NCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, mpt::byte_cast<BYTE *>(blob.data()), mpt::saturate_cast<DWORD>(blob.size()), &bytes, 0));
+			return public_key_data::from_cng_blob(name, blob);
+		}
+
+		std::vector<std::byte> sign_hash(typename hash_type::result_type hash) {
+			BCRYPT_PSS_PADDING_INFO paddinginfo;
+			paddinginfo.pszAlgId = hash_type::traits::bcrypt_name;
+			paddinginfo.cbSalt = mpt::saturate_cast<ULONG>(hash_type::traits::output_bytes);
+			DWORD bytes = 0;
+			CheckSECURITY_STATUS(NCryptSignHash(hKey, &paddinginfo, mpt::byte_cast<BYTE *>(hash.data()), mpt::saturate_cast<DWORD>(hash.size()), NULL, 0, &bytes, BCRYPT_PAD_PSS));
+			std::vector<std::byte> result(bytes);
+			CheckSECURITY_STATUS(NCryptSignHash(hKey, &paddinginfo, mpt::byte_cast<BYTE *>(hash.data()), mpt::saturate_cast<DWORD>(hash.size()), mpt::byte_cast<BYTE *>(result.data()), mpt::saturate_cast<DWORD>(result.size()), &bytes, BCRYPT_PAD_PSS));
+			return result;
+		}
+
+		std::vector<std::byte> sign(mpt::const_byte_span payload) {
+			return sign_hash(hash_type().process(payload).result());
+		}
+
+		mpt::ustring jws_compact_sign(mpt::const_byte_span payload) {
+			nlohmann::json protectedheader = nlohmann::json::object();
+			protectedheader["typ"] = "JWT";
+			protectedheader["alg"] = jwk_alg;
+			std::string protectedheaderstring = protectedheader.dump();
+			std::vector<std::byte> signature = sign_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload))))).result());
+			return mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(signature));
+		}
+
+		mpt::ustring jws_sign(mpt::const_byte_span payload) {
+			nlohmann::json protectedheader = nlohmann::json::object();
+			protectedheader["typ"] = "JWT";
+			protectedheader["alg"] = jwk_alg;
+			std::string protectedheaderstring = protectedheader.dump();
+			nlohmann::json header = nlohmann::json::object();
+			header["kid"] = name;
+			std::vector<std::byte> signature = sign_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload))))).result());
+			nlohmann::json jws = nlohmann::json::object();
+			jws["payload"] = mpt::encode_base64url(payload);
+			jws["signatures"] = nlohmann::json::array();
+			nlohmann::json jsignature = nlohmann::json::object();
+			jsignature["header"] = header;
+			jsignature["protected"] = mpt::encode_base64url(mpt::as_span(protectedheaderstring));
+			jsignature["signature"] = mpt::encode_base64url(mpt::as_span(signature));
+			jws["signatures"].push_back(jsignature);
+			return mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, jws.dump());
+		}
+	};
+
+}; // class rsassa_pss
+
+
+
+} // namespace asymmetric
+
+
+
+#endif // MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+
+
+} // namespace crypto
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_JWK_HPP

Property changes on: src/mpt/crypto/jwk.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/tests/tests_crypto.hpp
===================================================================
--- src/mpt/crypto/tests/tests_crypto.hpp	(nonexistent)
+++ src/mpt/crypto/tests/tests_crypto.hpp	(working copy)
@@ -0,0 +1,94 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_CRYPTO_HPP
+#define MPT_BASE_TESTS_CRYPTO_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/crypto/exception.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/crypto/jwk.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_crypto{
+	"mpt/crypto",
+	[](mpt::test::context & context) {
+
+#if MPT_OS_WINDOWS
+		mpt::crypto::hash::SHA512::result_type sha512_abc{
+			std::byte{0xdd}, std::byte{0xaf}, std::byte{0x35}, std::byte{0xa1}, std::byte{0x93}, std::byte{0x61}, std::byte{0x7a}, std::byte{0xba},
+			std::byte{0xcc}, std::byte{0x41}, std::byte{0x73}, std::byte{0x49}, std::byte{0xae}, std::byte{0x20}, std::byte{0x41}, std::byte{0x31},
+			std::byte{0x12}, std::byte{0xe6}, std::byte{0xfa}, std::byte{0x4e}, std::byte{0x89}, std::byte{0xa9}, std::byte{0x7e}, std::byte{0xa2},
+			std::byte{0x0a}, std::byte{0x9e}, std::byte{0xee}, std::byte{0xe6}, std::byte{0x4b}, std::byte{0x55}, std::byte{0xd3}, std::byte{0x9a},
+			std::byte{0x21}, std::byte{0x92}, std::byte{0x99}, std::byte{0x2a}, std::byte{0x27}, std::byte{0x4f}, std::byte{0xc1}, std::byte{0xa8},
+			std::byte{0x36}, std::byte{0xba}, std::byte{0x3c}, std::byte{0x23}, std::byte{0xa3}, std::byte{0xfe}, std::byte{0xeb}, std::byte{0xbd},
+			std::byte{0x45}, std::byte{0x4d}, std::byte{0x44}, std::byte{0x23}, std::byte{0x64}, std::byte{0x3c}, std::byte{0xe8}, std::byte{0x0e},
+			std::byte{0x2a}, std::byte{0x9a}, std::byte{0xc9}, std::byte{0x4f}, std::byte{0xa5}, std::byte{0x4c}, std::byte{0xa4}, std::byte{0x9f}};
+		MPT_TEST_EXPECT_EQUAL(mpt::crypto::hash::SHA512().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(std::string("abc")))).result(), sha512_abc);
+
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+		{
+
+			std::vector<std::byte> data = {std::byte{0x11}, std::byte{0x12}, std::byte{0x13}, std::byte{0x14}};
+
+			mpt::crypto::keystore keystore(mpt::crypto::keystore::domain::user);
+
+			mpt::crypto::asymmetric::rsassa_pss<>::managed_private_key key(keystore, U_("OpenMPT Test Key 1"));
+
+			auto publickeydata = key.get_public_key_data();
+
+			mpt::crypto::asymmetric::rsassa_pss<>::public_key pk{publickeydata};
+			mpt::crypto::asymmetric::rsassa_pss<>::public_key pk_copy{pk};
+			mpt::ustring jwk = publickeydata.as_jwk();
+
+			std::vector<std::byte> signature = key.sign(mpt::as_span(data));
+			mpt::ustring jws = key.jws_sign(mpt::as_span(data));
+			mpt::ustring jws_compact = key.jws_compact_sign(mpt::as_span(data));
+
+			try {
+				pk.verify(mpt::as_span(data), signature);
+				auto verifieddata1 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_verify(jws);
+				auto verifieddata2 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_compact_verify(jws_compact);
+				MPT_TEST_EXPECT_EQUAL(true, true);
+				MPT_TEST_EXPECT_EQUAL(data, verifieddata1);
+				MPT_TEST_EXPECT_EQUAL(data, verifieddata2);
+			} catch (const mpt::crypto::asymmetric::signature_verification_failed &) {
+				MPT_TEST_EXPECT_EQUAL(true, false);
+			}
+
+			key.destroy();
+		}
+
+#endif //  MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_CRYPTO_HPP

Property changes on: src/mpt/crypto/tests/tests_crypto.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/exception.hpp
===================================================================
--- src/mpt/crypto/exception.hpp	(nonexistent)
+++ src/mpt/crypto/exception.hpp	(working copy)
@@ -0,0 +1,102 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_EXCEPTION_HPP
+#define MPT_CRYPTO_EXCEPTION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+
+#include <stdexcept>
+
+#if MPT_OS_WINDOWS
+#include <ncrypt.h>
+#include <wincrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS
+
+class exception
+	: public std::runtime_error {
+private:
+	NTSTATUS m_Status;
+
+public:
+	exception(NTSTATUS status)
+		: std::runtime_error("crypto error")
+		, m_Status(status) {
+		return;
+	}
+
+public:
+	NTSTATUS code() const noexcept {
+		return m_Status;
+	}
+};
+
+
+class security_exception
+	: public std::runtime_error {
+private:
+	SECURITY_STATUS m_Status;
+
+public:
+	security_exception(SECURITY_STATUS status)
+		: std::runtime_error("crypto error")
+		, m_Status(status) {
+		return;
+	}
+
+public:
+	SECURITY_STATUS code() const noexcept {
+		return m_Status;
+	}
+};
+
+
+inline void CheckNTSTATUS(NTSTATUS status) {
+	if (status >= 0) {
+		return;
+	} else if (status == STATUS_NO_MEMORY) {
+		mpt::throw_out_of_memory();
+	} else {
+		throw exception(status);
+	}
+}
+
+
+inline void CheckSECURITY_STATUS(SECURITY_STATUS status) {
+	if (status == ERROR_SUCCESS) {
+		return;
+	} else if (status == NTE_NO_MEMORY) {
+		mpt::throw_out_of_memory();
+	} else {
+		throw security_exception(status);
+	}
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace crypto
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_EXCEPTION_HPP

Property changes on: src/mpt/crypto/exception.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/hash.hpp
===================================================================
--- src/mpt/crypto/hash.hpp	(nonexistent)
+++ src/mpt/crypto/hash.hpp	(working copy)
@@ -0,0 +1,180 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_HASH_HPP
+#define MPT_CRYPTO_HASH_HPP
+
+
+
+#include "mpt/base/array.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/crypto/exception.hpp"
+
+#include <algorithm>
+#include <vector>
+
+#include <cassert>
+#include <cstddef>
+
+#if MPT_OS_WINDOWS
+#include <bcrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+namespace hash {
+
+
+struct hash_traits_md5 {
+	static constexpr std::size_t output_bits = 128;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_MD5_ALGORITHM;
+};
+
+struct hash_traits_sha1 {
+	static constexpr std::size_t output_bits = 160;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA1_ALGORITHM;
+};
+
+struct hash_traits_sha256 {
+	static constexpr std::size_t output_bits = 256;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA256_ALGORITHM;
+};
+
+struct hash_traits_sha512 {
+	static constexpr std::size_t output_bits = 512;
+	static constexpr std::size_t output_bytes = output_bits / 8;
+	static constexpr const wchar_t * bcrypt_name = BCRYPT_SHA512_ALGORITHM;
+};
+
+template <typename Traits>
+class hash_impl {
+
+public:
+	using traits = Traits;
+
+	using result_type = std::array<std::byte, traits::output_bytes>;
+
+private:
+	BCRYPT_ALG_HANDLE hAlg = NULL;
+	std::vector<BYTE> hashState;
+	std::vector<BYTE> hashResult;
+	BCRYPT_HASH_HANDLE hHash = NULL;
+
+private:
+	void init() {
+		CheckNTSTATUS(BCryptOpenAlgorithmProvider(&hAlg, traits::bcrypt_name, NULL, 0));
+		if (!hAlg) {
+			throw exception(0);
+		}
+		DWORD hashStateSize = 0;
+		DWORD hashStateSizeSize = 0;
+		CheckNTSTATUS(BCryptGetProperty(hAlg, BCRYPT_OBJECT_LENGTH, (PBYTE)&hashStateSize, sizeof(DWORD), &hashStateSizeSize, 0));
+		if (hashStateSizeSize != sizeof(DWORD)) {
+			throw exception(0);
+		}
+		if (hashStateSize <= 0) {
+			throw exception(0);
+		}
+		hashState.resize(hashStateSize);
+		DWORD hashResultSize = 0;
+		DWORD hashResultSizeSize = 0;
+		CheckNTSTATUS(BCryptGetProperty(hAlg, BCRYPT_HASH_LENGTH, (PBYTE)&hashResultSize, sizeof(DWORD), &hashResultSizeSize, 0));
+		if (hashResultSizeSize != sizeof(DWORD)) {
+			throw exception(0);
+		}
+		if (hashResultSize <= 0) {
+			throw exception(0);
+		}
+		if (hashResultSize != mpt::extent<result_type>()) {
+			throw exception(0);
+		}
+		hashResult.resize(hashResultSize);
+		CheckNTSTATUS(BCryptCreateHash(hAlg, &hHash, hashState.data(), hashStateSize, NULL, 0, 0));
+		if (!hHash) {
+			throw exception(0);
+		}
+	}
+
+	void cleanup() {
+		if (hHash) {
+			BCryptDestroyHash(hHash);
+			hHash = NULL;
+		}
+		hashResult.resize(0);
+		hashResult.shrink_to_fit();
+		hashState.resize(0);
+		hashState.shrink_to_fit();
+		if (hAlg) {
+			BCryptCloseAlgorithmProvider(hAlg, 0);
+			hAlg = NULL;
+		}
+	}
+
+public:
+	hash_impl() {
+		try {
+			init();
+		} catch (...) {
+			cleanup();
+			throw;
+		}
+	}
+	hash_impl(const hash_impl &) = delete;
+	hash_impl & operator=(const hash_impl &) = delete;
+	~hash_impl() {
+		cleanup();
+	}
+
+public:
+	hash_impl & process(mpt::const_byte_span data) {
+		CheckNTSTATUS(BCryptHashData(hHash, const_cast<UCHAR *>(mpt::byte_cast<const UCHAR *>(data.data())), mpt::saturate_cast<ULONG>(data.size()), 0));
+		return *this;
+	}
+
+	result_type result() {
+		result_type res = mpt::init_array<std::byte, traits::output_bytes>(std::byte{0});
+		CheckNTSTATUS(BCryptFinishHash(hHash, hashResult.data(), mpt::saturate_cast<ULONG>(hashResult.size()), 0));
+		assert(hashResult.size() == mpt::extent<result_type>());
+		std::transform(hashResult.begin(), hashResult.end(), res.begin(), [](BYTE b) { return mpt::as_byte(b); });
+		return res;
+	}
+};
+
+using MD5 = hash_impl<hash_traits_md5>;
+using SHA1 = hash_impl<hash_traits_sha1>;
+using SHA256 = hash_impl<hash_traits_sha256>;
+using SHA512 = hash_impl<hash_traits_sha512>;
+
+
+} // namespace hash
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace crypto
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_HASH_HPP

Property changes on: src/mpt/crypto/hash.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/jwk.hpp
===================================================================
--- src/mpt/crypto/jwk.hpp	(nonexistent)
+++ src/mpt/crypto/jwk.hpp	(working copy)
@@ -0,0 +1,532 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_CRYPTO_JWK_HPP
+#define MPT_CRYPTO_JWK_HPP
+
+
+
+#include "mpt/base/alloc.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/binary/base64url.hpp"
+#include "mpt/crypto/exception.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+#include "mpt/json/json.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <algorithm>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include <cassert>
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+
+#if MPT_OS_WINDOWS
+#include <bcrypt.h>
+#include <ncrypt.h>
+#include <wincrypt.h>
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace crypto {
+
+
+
+#if MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+
+
+class keystore {
+public:
+	enum class domain
+	{
+		system = 1,
+		user = 2,
+	};
+
+private:
+	NCRYPT_PROV_HANDLE hProv = NULL;
+	domain ProvDomain = domain::user;
+
+private:
+	void cleanup() {
+		if (hProv) {
+			NCryptFreeObject(hProv);
+			hProv = NULL;
+		}
+	}
+
+public:
+	keystore(domain d)
+		: ProvDomain(d) {
+		try {
+			CheckSECURITY_STATUS(NCryptOpenStorageProvider(&hProv, MS_KEY_STORAGE_PROVIDER, 0));
+		} catch (...) {
+			cleanup();
+			throw;
+		}
+	}
+	~keystore() {
+		return;
+	}
+	operator NCRYPT_PROV_HANDLE() {
+		return hProv;
+	}
+	keystore::domain store_domain() const {
+		return ProvDomain;
+	}
+};
+
+
+
+namespace asymmetric {
+
+
+
+class signature_verification_failed
+	: public std::runtime_error {
+public:
+	signature_verification_failed()
+		: std::runtime_error("Signature Verification failed.") {
+		return;
+	}
+};
+
+
+
+inline std::vector<mpt::ustring> jws_get_keynames(const mpt::ustring & jws_) {
+	std::vector<mpt::ustring> result;
+	nlohmann::json jws = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jws_));
+	for (const auto & s : jws["signatures"]) {
+		result.push_back(s["header"]["kid"]);
+	}
+	return result;
+}
+
+
+
+struct RSASSA_PSS_SHA512_traits {
+	using hash_type = mpt::crypto::hash::SHA512;
+	static constexpr const char * jwk_alg = "PS512";
+};
+
+
+
+template <typename Traits = RSASSA_PSS_SHA512_traits, std::size_t keysize = 4096>
+class rsassa_pss {
+
+public:
+	using hash_type = typename Traits::hash_type;
+	static constexpr const char * jwk_alg = Traits::jwk_alg;
+
+	struct public_key_data {
+
+		mpt::ustring name;
+		uint32 length = 0;
+		std::vector<std::byte> public_exp;
+		std::vector<std::byte> modulus;
+
+		std::vector<std::byte> as_cng_blob() const {
+			BCRYPT_RSAKEY_BLOB rsakey_blob{};
+			rsakey_blob.Magic = BCRYPT_RSAPUBLIC_MAGIC;
+			rsakey_blob.BitLength = length;
+			rsakey_blob.cbPublicExp = mpt::saturate_cast<ULONG>(public_exp.size());
+			rsakey_blob.cbModulus = mpt::saturate_cast<ULONG>(modulus.size());
+			std::vector<std::byte> result(sizeof(BCRYPT_RSAKEY_BLOB) + public_exp.size() + modulus.size());
+			std::memcpy(result.data(), &rsakey_blob, sizeof(BCRYPT_RSAKEY_BLOB));
+			std::memcpy(result.data() + sizeof(BCRYPT_RSAKEY_BLOB), public_exp.data(), public_exp.size());
+			std::memcpy(result.data() + sizeof(BCRYPT_RSAKEY_BLOB) + public_exp.size(), modulus.data(), modulus.size());
+			return result;
+		}
+
+		mpt::ustring as_jwk() const {
+			nlohmann::json json = nlohmann::json::object();
+			json["kid"] = name;
+			json["kty"] = "RSA";
+			json["alg"] = jwk_alg;
+			json["use"] = "sig";
+			json["e"] = mpt::encode_base64url(mpt::as_span(public_exp));
+			json["n"] = mpt::encode_base64url(mpt::as_span(modulus));
+			return mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, json.dump());
+		}
+
+		static public_key_data from_jwk(const mpt::ustring & jwk) {
+			public_key_data result;
+			try {
+				nlohmann::json json = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jwk));
+				if (json["kty"] != "RSA") {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				if (json["alg"] != jwk_alg) {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				if (json["use"] != "sig") {
+					throw std::runtime_error("Cannot parse RSA public key JWK.");
+				}
+				result.name = json["kid"].get<mpt::ustring>();
+				result.public_exp = mpt::decode_base64url(json["e"]);
+				result.modulus = mpt::decode_base64url(json["n"]);
+				result.length = mpt::saturate_cast<uint32>(result.modulus.size() * 8);
+			} catch (mpt::out_of_memory e) {
+				mpt::rethrow_out_of_memory(e);
+			} catch (...) {
+				throw std::runtime_error("Cannot parse RSA public key JWK.");
+			}
+			return result;
+		}
+
+		static public_key_data from_cng_blob(const mpt::ustring & name, const std::vector<std::byte> & blob) {
+			public_key_data result;
+			BCRYPT_RSAKEY_BLOB rsakey_blob{};
+			if (blob.size() < sizeof(BCRYPT_RSAKEY_BLOB)) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			std::memcpy(&rsakey_blob, blob.data(), sizeof(BCRYPT_RSAKEY_BLOB));
+			if (rsakey_blob.Magic != BCRYPT_RSAPUBLIC_MAGIC) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			if (blob.size() != sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp + rsakey_blob.cbModulus) {
+				throw std::runtime_error("Cannot parse RSA public key blob.");
+			}
+			result.name = name;
+			result.length = rsakey_blob.BitLength;
+			result.public_exp = std::vector<std::byte>(blob.data() + sizeof(BCRYPT_RSAKEY_BLOB), blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp);
+			result.modulus = std::vector<std::byte>(blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp, blob.data() + sizeof(BCRYPT_RSAKEY_BLOB) + rsakey_blob.cbPublicExp + rsakey_blob.cbModulus);
+			return result;
+		}
+	};
+
+
+
+	static std::vector<public_key_data> parse_jwk_set(const mpt::ustring & jwk_set_) {
+		std::vector<public_key_data> result;
+		nlohmann::json jwk_set = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jwk_set_));
+		for (const auto & k : jwk_set["keys"]) {
+			try {
+				result.push_back(public_key_data::from_jwk(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, k.dump())));
+			} catch (...) {
+				// nothing
+			}
+		}
+		return result;
+	}
+
+
+
+	class public_key {
+
+	private:
+		mpt::ustring name;
+		BCRYPT_ALG_HANDLE hSignAlg = NULL;
+		BCRYPT_KEY_HANDLE hKey = NULL;
+
+	private:
+		void cleanup() {
+			if (hKey) {
+				BCryptDestroyKey(hKey);
+				hKey = NULL;
+			}
+			if (hSignAlg) {
+				BCryptCloseAlgorithmProvider(hSignAlg, 0);
+				hSignAlg = NULL;
+			}
+		}
+
+	public:
+		public_key(const public_key_data & data) {
+			try {
+				name = data.name;
+				CheckNTSTATUS(BCryptOpenAlgorithmProvider(&hSignAlg, BCRYPT_RSA_ALGORITHM, NULL, 0));
+				std::vector<std::byte> blob = data.as_cng_blob();
+				CheckNTSTATUS(BCryptImportKeyPair(hSignAlg, NULL, BCRYPT_RSAPUBLIC_BLOB, &hKey, mpt::byte_cast<UCHAR *>(blob.data()), mpt::saturate_cast<ULONG>(blob.size()), 0));
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		public_key(const public_key & other)
+			: public_key(other.get_public_key_data()) {
+			return;
+		}
+
+		public_key & operator=(const public_key & other) {
+			if (&other == this) {
+				return *this;
+			}
+			public_key copy(other);
+			{
+				using std::swap;
+				swap(copy.name, name);
+				swap(copy.hSignAlg, hSignAlg);
+				swap(copy.hKey, hKey);
+			}
+			return *this;
+		}
+
+		~public_key() {
+			cleanup();
+		}
+
+		mpt::ustring get_name() const {
+			return name;
+		}
+
+		public_key_data get_public_key_data() const {
+			DWORD bytes = 0;
+			CheckNTSTATUS(BCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, 0, &bytes, 0));
+			std::vector<std::byte> blob(bytes);
+			CheckNTSTATUS(BCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, mpt::byte_cast<BYTE *>(blob.data()), mpt::saturate_cast<DWORD>(blob.size()), &bytes, 0));
+			return public_key_data::from_cng_blob(name, blob);
+		}
+
+		void verify_hash(typename hash_type::result_type hash, std::vector<std::byte> signature) {
+			BCRYPT_PSS_PADDING_INFO paddinginfo;
+			paddinginfo.pszAlgId = hash_type::traits::bcrypt_name;
+			paddinginfo.cbSalt = mpt::saturate_cast<ULONG>(hash_type::traits::output_bytes);
+			NTSTATUS result = BCryptVerifySignature(hKey, &paddinginfo, mpt::byte_cast<UCHAR *>(hash.data()), mpt::saturate_cast<ULONG>(hash.size()), mpt::byte_cast<UCHAR *>(signature.data()), mpt::saturate_cast<ULONG>(signature.size()), BCRYPT_PAD_PSS);
+			if (result == 0x00000000 /*STATUS_SUCCESS*/) {
+				return;
+			}
+			if (result == 0xC000A000 /*STATUS_INVALID_SIGNATURE*/) {
+				throw signature_verification_failed();
+			}
+			CheckNTSTATUS(result);
+			throw signature_verification_failed();
+		}
+
+		void verify(mpt::const_byte_span payload, const std::vector<std::byte> & signature) {
+			verify_hash(hash_type().process(payload).result(), signature);
+		}
+
+		std::vector<std::byte> jws_verify(const mpt::ustring & jws_) {
+			nlohmann::json jws = nlohmann::json::parse(mpt::convert<std::string>(mpt::common_encoding::utf8, jws_));
+			std::vector<std::byte> payload = mpt::decode_base64url(jws["payload"]);
+			nlohmann::json jsignature = nlohmann::json::object();
+			bool sigfound = false;
+			for (const auto & s : jws["signatures"]) {
+				if (s["header"]["kid"] == mpt::convert<std::string>(mpt::common_encoding::utf8, name)) {
+					jsignature = s;
+					sigfound = true;
+				}
+			}
+			if (!sigfound) {
+				throw signature_verification_failed();
+			}
+			std::vector<std::byte> protectedheaderraw = mpt::decode_base64url(jsignature["protected"]);
+			std::vector<std::byte> signature = mpt::decode_base64url(jsignature["signature"]);
+			nlohmann::json header = nlohmann::json::parse(mpt::buffer_cast<std::string>(protectedheaderraw));
+			if (header["typ"] != "JWT") {
+				throw signature_verification_failed();
+			}
+			if (header["alg"] != jwk_alg) {
+				throw signature_verification_failed();
+			}
+			verify_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderraw)) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(payload)))))).result(), signature);
+			return payload;
+		}
+
+		std::vector<std::byte> jws_compact_verify(const mpt::ustring & jws) {
+			std::vector<mpt::ustring> parts = mpt::split<mpt::ustring>(jws, MPT_USTRING("."));
+			if (parts.size() != 3) {
+				throw signature_verification_failed();
+			}
+			std::vector<std::byte> protectedheaderraw = mpt::decode_base64url(parts[0]);
+			std::vector<std::byte> payload = mpt::decode_base64url(parts[1]);
+			std::vector<std::byte> signature = mpt::decode_base64url(parts[2]);
+			nlohmann::json header = nlohmann::json::parse(mpt::buffer_cast<std::string>(protectedheaderraw));
+			if (header["typ"] != "JWT") {
+				throw signature_verification_failed();
+			}
+			if (header["alg"] != jwk_alg) {
+				throw signature_verification_failed();
+			}
+			verify_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderraw)) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(payload)))))).result(), signature);
+			return payload;
+		}
+	};
+
+
+
+	static inline void jws_verify_at_least_one(std::vector<public_key> & keys, const std::vector<std::byte> & expectedPayload, const mpt::ustring & signature) {
+		std::vector<mpt::ustring> keynames = mpt::crypto::asymmetric::jws_get_keynames(signature);
+		bool sigchecked = false;
+		for (const auto & keyname : keynames) {
+			for (auto & key : keys) {
+				if (key.get_name() == keyname) {
+					if (expectedPayload != key.jws_verify(signature)) {
+						throw mpt::crypto::asymmetric::signature_verification_failed();
+					}
+					sigchecked = true;
+				}
+			}
+		}
+		if (!sigchecked) {
+			throw mpt::crypto::asymmetric::signature_verification_failed();
+		}
+	}
+
+
+
+	static inline std::vector<std::byte> jws_verify_at_least_one(std::vector<public_key> & keys, const mpt::ustring & signature) {
+		std::vector<mpt::ustring> keynames = mpt::crypto::asymmetric::jws_get_keynames(signature);
+		for (const auto & keyname : keynames) {
+			for (auto & key : keys) {
+				if (key.get_name() == keyname) {
+					return key.jws_verify(signature);
+				}
+			}
+		}
+		throw mpt::crypto::asymmetric::signature_verification_failed();
+	}
+
+
+
+	class managed_private_key {
+
+	private:
+		mpt::ustring name;
+		NCRYPT_KEY_HANDLE hKey = NULL;
+
+	private:
+		void cleanup() {
+			if (hKey) {
+				NCryptFreeObject(hKey);
+				hKey = NULL;
+			}
+		}
+
+	public:
+		managed_private_key() = delete;
+
+		managed_private_key(const managed_private_key &) = delete;
+
+		managed_private_key & operator=(const managed_private_key &) = delete;
+
+		managed_private_key(keystore & keystore) {
+			try {
+				CheckSECURITY_STATUS(NCryptCreatePersistedKey(keystore, &hKey, BCRYPT_RSA_ALGORITHM, NULL, 0, 0));
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		managed_private_key(keystore & keystore, const mpt::ustring & name_)
+			: name(name_) {
+			try {
+				SECURITY_STATUS openKeyStatus = NCryptOpenKey(keystore, &hKey, mpt::convert<std::wstring>(name).c_str(), 0, (keystore.store_domain() == keystore::domain::system ? NCRYPT_MACHINE_KEY_FLAG : 0));
+				if (openKeyStatus == NTE_BAD_KEYSET) {
+					CheckSECURITY_STATUS(NCryptCreatePersistedKey(keystore, &hKey, BCRYPT_RSA_ALGORITHM, mpt::convert<std::wstring>(name).c_str(), 0, (keystore.store_domain() == keystore::domain::system ? NCRYPT_MACHINE_KEY_FLAG : 0)));
+					DWORD length = mpt::saturate_cast<DWORD>(keysize);
+					CheckSECURITY_STATUS(NCryptSetProperty(hKey, NCRYPT_LENGTH_PROPERTY, (PBYTE)&length, mpt::saturate_cast<DWORD>(sizeof(DWORD)), 0));
+					CheckSECURITY_STATUS(NCryptFinalizeKey(hKey, 0));
+				} else {
+					CheckSECURITY_STATUS(openKeyStatus);
+				}
+			} catch (...) {
+				cleanup();
+				throw;
+			}
+		}
+
+		~managed_private_key() {
+			cleanup();
+		}
+
+		void destroy() {
+			CheckSECURITY_STATUS(NCryptDeleteKey(hKey, 0));
+			name = mpt::ustring();
+			hKey = NULL;
+		}
+
+	public:
+		public_key_data get_public_key_data() const {
+			DWORD bytes = 0;
+			CheckSECURITY_STATUS(NCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, NULL, 0, &bytes, 0));
+			std::vector<std::byte> blob(bytes);
+			CheckSECURITY_STATUS(NCryptExportKey(hKey, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, mpt::byte_cast<BYTE *>(blob.data()), mpt::saturate_cast<DWORD>(blob.size()), &bytes, 0));
+			return public_key_data::from_cng_blob(name, blob);
+		}
+
+		std::vector<std::byte> sign_hash(typename hash_type::result_type hash) {
+			BCRYPT_PSS_PADDING_INFO paddinginfo;
+			paddinginfo.pszAlgId = hash_type::traits::bcrypt_name;
+			paddinginfo.cbSalt = mpt::saturate_cast<ULONG>(hash_type::traits::output_bytes);
+			DWORD bytes = 0;
+			CheckSECURITY_STATUS(NCryptSignHash(hKey, &paddinginfo, mpt::byte_cast<BYTE *>(hash.data()), mpt::saturate_cast<DWORD>(hash.size()), NULL, 0, &bytes, BCRYPT_PAD_PSS));
+			std::vector<std::byte> result(bytes);
+			CheckSECURITY_STATUS(NCryptSignHash(hKey, &paddinginfo, mpt::byte_cast<BYTE *>(hash.data()), mpt::saturate_cast<DWORD>(hash.size()), mpt::byte_cast<BYTE *>(result.data()), mpt::saturate_cast<DWORD>(result.size()), &bytes, BCRYPT_PAD_PSS));
+			return result;
+		}
+
+		std::vector<std::byte> sign(mpt::const_byte_span payload) {
+			return sign_hash(hash_type().process(payload).result());
+		}
+
+		mpt::ustring jws_compact_sign(mpt::const_byte_span payload) {
+			nlohmann::json protectedheader = nlohmann::json::object();
+			protectedheader["typ"] = "JWT";
+			protectedheader["alg"] = jwk_alg;
+			std::string protectedheaderstring = protectedheader.dump();
+			std::vector<std::byte> signature = sign_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload))))).result());
+			return mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload) + MPT_USTRING(".") + mpt::encode_base64url(mpt::as_span(signature));
+		}
+
+		mpt::ustring jws_sign(mpt::const_byte_span payload) {
+			nlohmann::json protectedheader = nlohmann::json::object();
+			protectedheader["typ"] = "JWT";
+			protectedheader["alg"] = jwk_alg;
+			std::string protectedheaderstring = protectedheader.dump();
+			nlohmann::json header = nlohmann::json::object();
+			header["kid"] = name;
+			std::vector<std::byte> signature = sign_hash(hash_type().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(mpt::convert<std::string>(mpt::common_encoding::utf8, mpt::encode_base64url(mpt::as_span(protectedheaderstring)) + MPT_USTRING(".") + mpt::encode_base64url(payload))))).result());
+			nlohmann::json jws = nlohmann::json::object();
+			jws["payload"] = mpt::encode_base64url(payload);
+			jws["signatures"] = nlohmann::json::array();
+			nlohmann::json jsignature = nlohmann::json::object();
+			jsignature["header"] = header;
+			jsignature["protected"] = mpt::encode_base64url(mpt::as_span(protectedheaderstring));
+			jsignature["signature"] = mpt::encode_base64url(mpt::as_span(signature));
+			jws["signatures"].push_back(jsignature);
+			return mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, jws.dump());
+		}
+	};
+
+}; // class rsassa_pss
+
+
+
+} // namespace asymmetric
+
+
+
+#endif // MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+
+
+} // namespace crypto
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_CRYPTO_JWK_HPP

Property changes on: src/mpt/crypto/jwk.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/tests/tests_crypto.hpp
===================================================================
--- src/mpt/crypto/tests/tests_crypto.hpp	(nonexistent)
+++ src/mpt/crypto/tests/tests_crypto.hpp	(working copy)
@@ -0,0 +1,94 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_CRYPTO_HPP
+#define MPT_BASE_TESTS_CRYPTO_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/crypto/exception.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/crypto/jwk.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_crypto{
+	"mpt/crypto",
+	[](mpt::test::context & context) {
+
+#if MPT_OS_WINDOWS
+		mpt::crypto::hash::SHA512::result_type sha512_abc{
+			std::byte{0xdd}, std::byte{0xaf}, std::byte{0x35}, std::byte{0xa1}, std::byte{0x93}, std::byte{0x61}, std::byte{0x7a}, std::byte{0xba},
+			std::byte{0xcc}, std::byte{0x41}, std::byte{0x73}, std::byte{0x49}, std::byte{0xae}, std::byte{0x20}, std::byte{0x41}, std::byte{0x31},
+			std::byte{0x12}, std::byte{0xe6}, std::byte{0xfa}, std::byte{0x4e}, std::byte{0x89}, std::byte{0xa9}, std::byte{0x7e}, std::byte{0xa2},
+			std::byte{0x0a}, std::byte{0x9e}, std::byte{0xee}, std::byte{0xe6}, std::byte{0x4b}, std::byte{0x55}, std::byte{0xd3}, std::byte{0x9a},
+			std::byte{0x21}, std::byte{0x92}, std::byte{0x99}, std::byte{0x2a}, std::byte{0x27}, std::byte{0x4f}, std::byte{0xc1}, std::byte{0xa8},
+			std::byte{0x36}, std::byte{0xba}, std::byte{0x3c}, std::byte{0x23}, std::byte{0xa3}, std::byte{0xfe}, std::byte{0xeb}, std::byte{0xbd},
+			std::byte{0x45}, std::byte{0x4d}, std::byte{0x44}, std::byte{0x23}, std::byte{0x64}, std::byte{0x3c}, std::byte{0xe8}, std::byte{0x0e},
+			std::byte{0x2a}, std::byte{0x9a}, std::byte{0xc9}, std::byte{0x4f}, std::byte{0xa5}, std::byte{0x4c}, std::byte{0xa4}, std::byte{0x9f}};
+		MPT_TEST_EXPECT_EQUAL(mpt::crypto::hash::SHA512().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(std::string("abc")))).result(), sha512_abc);
+
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+		{
+
+			std::vector<std::byte> data = {std::byte{0x11}, std::byte{0x12}, std::byte{0x13}, std::byte{0x14}};
+
+			mpt::crypto::keystore keystore(mpt::crypto::keystore::domain::user);
+
+			mpt::crypto::asymmetric::rsassa_pss<>::managed_private_key key(keystore, U_("OpenMPT Test Key 1"));
+
+			auto publickeydata = key.get_public_key_data();
+
+			mpt::crypto::asymmetric::rsassa_pss<>::public_key pk{publickeydata};
+			mpt::crypto::asymmetric::rsassa_pss<>::public_key pk_copy{pk};
+			mpt::ustring jwk = publickeydata.as_jwk();
+
+			std::vector<std::byte> signature = key.sign(mpt::as_span(data));
+			mpt::ustring jws = key.jws_sign(mpt::as_span(data));
+			mpt::ustring jws_compact = key.jws_compact_sign(mpt::as_span(data));
+
+			try {
+				pk.verify(mpt::as_span(data), signature);
+				auto verifieddata1 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_verify(jws);
+				auto verifieddata2 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_compact_verify(jws_compact);
+				MPT_TEST_EXPECT_EQUAL(true, true);
+				MPT_TEST_EXPECT_EQUAL(data, verifieddata1);
+				MPT_TEST_EXPECT_EQUAL(data, verifieddata2);
+			} catch (const mpt::crypto::asymmetric::signature_verification_failed &) {
+				MPT_TEST_EXPECT_EQUAL(true, false);
+			}
+
+			key.destroy();
+		}
+
+#endif //  MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_CRYPTO_HPP

Property changes on: src/mpt/crypto/tests/tests_crypto.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/crypto/tests/tests_crypto.hpp
===================================================================
--- src/mpt/crypto/tests/tests_crypto.hpp	(nonexistent)
+++ src/mpt/crypto/tests/tests_crypto.hpp	(working copy)
@@ -0,0 +1,94 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_CRYPTO_HPP
+#define MPT_BASE_TESTS_CRYPTO_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/crypto/exception.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/crypto/jwk.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_crypto{
+	"mpt/crypto",
+	[](mpt::test::context & context) {
+
+#if MPT_OS_WINDOWS
+		mpt::crypto::hash::SHA512::result_type sha512_abc{
+			std::byte{0xdd}, std::byte{0xaf}, std::byte{0x35}, std::byte{0xa1}, std::byte{0x93}, std::byte{0x61}, std::byte{0x7a}, std::byte{0xba},
+			std::byte{0xcc}, std::byte{0x41}, std::byte{0x73}, std::byte{0x49}, std::byte{0xae}, std::byte{0x20}, std::byte{0x41}, std::byte{0x31},
+			std::byte{0x12}, std::byte{0xe6}, std::byte{0xfa}, std::byte{0x4e}, std::byte{0x89}, std::byte{0xa9}, std::byte{0x7e}, std::byte{0xa2},
+			std::byte{0x0a}, std::byte{0x9e}, std::byte{0xee}, std::byte{0xe6}, std::byte{0x4b}, std::byte{0x55}, std::byte{0xd3}, std::byte{0x9a},
+			std::byte{0x21}, std::byte{0x92}, std::byte{0x99}, std::byte{0x2a}, std::byte{0x27}, std::byte{0x4f}, std::byte{0xc1}, std::byte{0xa8},
+			std::byte{0x36}, std::byte{0xba}, std::byte{0x3c}, std::byte{0x23}, std::byte{0xa3}, std::byte{0xfe}, std::byte{0xeb}, std::byte{0xbd},
+			std::byte{0x45}, std::byte{0x4d}, std::byte{0x44}, std::byte{0x23}, std::byte{0x64}, std::byte{0x3c}, std::byte{0xe8}, std::byte{0x0e},
+			std::byte{0x2a}, std::byte{0x9a}, std::byte{0xc9}, std::byte{0x4f}, std::byte{0xa5}, std::byte{0x4c}, std::byte{0xa4}, std::byte{0x9f}};
+		MPT_TEST_EXPECT_EQUAL(mpt::crypto::hash::SHA512().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(std::string("abc")))).result(), sha512_abc);
+
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+
+		{
+
+			std::vector<std::byte> data = {std::byte{0x11}, std::byte{0x12}, std::byte{0x13}, std::byte{0x14}};
+
+			mpt::crypto::keystore keystore(mpt::crypto::keystore::domain::user);
+
+			mpt::crypto::asymmetric::rsassa_pss<>::managed_private_key key(keystore, U_("OpenMPT Test Key 1"));
+
+			auto publickeydata = key.get_public_key_data();
+
+			mpt::crypto::asymmetric::rsassa_pss<>::public_key pk{publickeydata};
+			mpt::crypto::asymmetric::rsassa_pss<>::public_key pk_copy{pk};
+			mpt::ustring jwk = publickeydata.as_jwk();
+
+			std::vector<std::byte> signature = key.sign(mpt::as_span(data));
+			mpt::ustring jws = key.jws_sign(mpt::as_span(data));
+			mpt::ustring jws_compact = key.jws_compact_sign(mpt::as_span(data));
+
+			try {
+				pk.verify(mpt::as_span(data), signature);
+				auto verifieddata1 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_verify(jws);
+				auto verifieddata2 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_compact_verify(jws_compact);
+				MPT_TEST_EXPECT_EQUAL(true, true);
+				MPT_TEST_EXPECT_EQUAL(data, verifieddata1);
+				MPT_TEST_EXPECT_EQUAL(data, verifieddata2);
+			} catch (const mpt::crypto::asymmetric::signature_verification_failed &) {
+				MPT_TEST_EXPECT_EQUAL(true, false);
+			}
+
+			key.destroy();
+		}
+
+#endif //  MPT_OS_WINDOWS && MPT_DETECTED_NLOHMANN_JSON
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_CRYPTO_HPP

Property changes on: src/mpt/crypto/tests/tests_crypto.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/detect/mfc.hpp
===================================================================
--- src/mpt/detect/mfc.hpp	(nonexistent)
+++ src/mpt/detect/mfc.hpp	(working copy)
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_DETECT_MFC_HPP
+#define MPT_DETECT_MFC_HPP
+
+#include "mpt/base/compiletime_warning.hpp"
+
+#if defined(MPT_WITH_MFC)
+#if !__has_include(<afx.h>)
+#error "MPT_WITH_MFC defined but <afx.h> not found."
+#endif
+#if !MPT_COMPILER_GENERIC && !MPT_COMPILER_MSVC && !MPT_COMPILER_CLANG
+MPT_WARNING("Using MFC with unsupported compiler.")
+#endif
+#define MPT_DETECTED_MFC 1
+#else
+#define MPT_DETECTED_MFC 0
+#endif
+
+#endif // MPT_DETECT_MFC_HPP

Property changes on: src/mpt/detect/mfc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/detect/nlohmann_json.hpp
===================================================================
--- src/mpt/detect/nlohmann_json.hpp	(nonexistent)
+++ src/mpt/detect/nlohmann_json.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_DETECT_NLOHMANN_JSON_HPP
+#define MPT_DETECT_NLOHMANN_JSON_HPP
+
+#if defined(MPT_WITH_NLOHMANN_JSON)
+#if !__has_include(<nlohmann/json.hpp>)
+#error "MPT_WITH_NLOHMANN_JSON defined but <nlohmann/json.hpp> not found."
+#endif
+#define MPT_DETECTED_NLOHMANN_JSON 1
+#else
+#if __has_include(<nlohmann/json.hpp>)
+#define MPT_DETECTED_NLOHMANN_JSON 1
+#else
+#define MPT_DETECTED_NLOHMANN_JSON 0
+#endif
+#endif
+
+#endif // MPT_DETECT_NLOHMANN_JSON_HPP

Property changes on: src/mpt/detect/nlohmann_json.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/detect/mfc.hpp
===================================================================
--- src/mpt/detect/mfc.hpp	(nonexistent)
+++ src/mpt/detect/mfc.hpp	(working copy)
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_DETECT_MFC_HPP
+#define MPT_DETECT_MFC_HPP
+
+#include "mpt/base/compiletime_warning.hpp"
+
+#if defined(MPT_WITH_MFC)
+#if !__has_include(<afx.h>)
+#error "MPT_WITH_MFC defined but <afx.h> not found."
+#endif
+#if !MPT_COMPILER_GENERIC && !MPT_COMPILER_MSVC && !MPT_COMPILER_CLANG
+MPT_WARNING("Using MFC with unsupported compiler.")
+#endif
+#define MPT_DETECTED_MFC 1
+#else
+#define MPT_DETECTED_MFC 0
+#endif
+
+#endif // MPT_DETECT_MFC_HPP

Property changes on: src/mpt/detect/mfc.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/detect/nlohmann_json.hpp
===================================================================
--- src/mpt/detect/nlohmann_json.hpp	(nonexistent)
+++ src/mpt/detect/nlohmann_json.hpp	(working copy)
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_DETECT_NLOHMANN_JSON_HPP
+#define MPT_DETECT_NLOHMANN_JSON_HPP
+
+#if defined(MPT_WITH_NLOHMANN_JSON)
+#if !__has_include(<nlohmann/json.hpp>)
+#error "MPT_WITH_NLOHMANN_JSON defined but <nlohmann/json.hpp> not found."
+#endif
+#define MPT_DETECTED_NLOHMANN_JSON 1
+#else
+#if __has_include(<nlohmann/json.hpp>)
+#define MPT_DETECTED_NLOHMANN_JSON 1
+#else
+#define MPT_DETECTED_NLOHMANN_JSON 0
+#endif
+#endif
+
+#endif // MPT_DETECT_NLOHMANN_JSON_HPP

Property changes on: src/mpt/detect/nlohmann_json.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/floatingpoint.hpp
===================================================================
--- src/mpt/endian/floatingpoint.hpp	(nonexistent)
+++ src/mpt/endian/floatingpoint.hpp	(working copy)
@@ -0,0 +1,441 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_FLOATINGPOINT_HPP
+#define MPT_ENDIAN_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/floatingpoint.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+
+#include <cmath>
+#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+// 1.0f --> 0x3f800000u
+MPT_FORCEINLINE uint32 EncodeIEEE754binary32(float32 f) {
+	if constexpr (mpt::float_traits<float32>::is_ieee754_binary32ne) {
+		return mpt::bit_cast<uint32>(f);
+	} else {
+		int e = 0;
+		float m = std::frexp(f, &e);
+		if (e == 0 && std::fabs(m) == 0.0f) {
+			uint32 expo = 0u;
+			uint32 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint32 mant = 0u;
+			uint32 i = 0u;
+			i |= (mant << 0) & 0x007fffffu;
+			i |= (expo << 23) & 0x7f800000u;
+			i |= (sign << 31) & 0x80000000u;
+			return i;
+		} else {
+			uint32 expo = e + 127 - 1;
+			uint32 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint32 mant = static_cast<uint32>(std::fabs(std::ldexp(m, 24)));
+			uint32 i = 0u;
+			i |= (mant << 0) & 0x007fffffu;
+			i |= (expo << 23) & 0x7f800000u;
+			i |= (sign << 31) & 0x80000000u;
+			return i;
+		}
+	}
+}
+
+MPT_FORCEINLINE uint64 EncodeIEEE754binary64(float64 f) {
+	if constexpr (mpt::float_traits<float64>::is_ieee754_binary64ne) {
+		return mpt::bit_cast<uint64>(f);
+	} else {
+		int e = 0;
+		double m = std::frexp(f, &e);
+		if (e == 0 && std::fabs(m) == 0.0) {
+			uint64 expo = 0u;
+			uint64 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint64 mant = 0u;
+			uint64 i = 0u;
+			i |= (mant << 0) & 0x000fffffffffffffull;
+			i |= (expo << 52) & 0x7ff0000000000000ull;
+			i |= (sign << 63) & 0x8000000000000000ull;
+			return i;
+		} else {
+			uint64 expo = static_cast<int64>(e) + 1023 - 1;
+			uint64 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint64 mant = static_cast<uint64>(std::fabs(std::ldexp(m, 53)));
+			uint64 i = 0u;
+			i |= (mant << 0) & 0x000fffffffffffffull;
+			i |= (expo << 52) & 0x7ff0000000000000ull;
+			i |= (sign << 63) & 0x8000000000000000ull;
+			return i;
+		}
+	}
+}
+
+// 0x3f800000u --> 1.0f
+MPT_FORCEINLINE float32 DecodeIEEE754binary32(uint32 i) {
+	if constexpr (mpt::float_traits<float32>::is_ieee754_binary32ne) {
+		return mpt::bit_cast<float32>(i);
+	} else {
+		uint32 mant = (i & 0x007fffffu) >> 0;
+		uint32 expo = (i & 0x7f800000u) >> 23;
+		uint32 sign = (i & 0x80000000u) >> 31;
+		if (expo == 0) {
+			float m = sign ? -static_cast<float>(mant) : static_cast<float>(mant);
+			int e = static_cast<int>(expo) - 127 + 1 - 24;
+			float f = std::ldexp(m, e);
+			return static_cast<float32>(f);
+		} else {
+			mant |= 0x00800000u;
+			float m = sign ? -static_cast<float>(mant) : static_cast<float>(mant);
+			int e = static_cast<int>(expo) - 127 + 1 - 24;
+			float f = std::ldexp(m, e);
+			return static_cast<float32>(f);
+		}
+	}
+}
+
+MPT_FORCEINLINE float64 DecodeIEEE754binary64(uint64 i) {
+	if constexpr (mpt::float_traits<float64>::is_ieee754_binary64ne) {
+		return mpt::bit_cast<float64>(i);
+	} else {
+		uint64 mant = (i & 0x000fffffffffffffull) >> 0;
+		uint64 expo = (i & 0x7ff0000000000000ull) >> 52;
+		uint64 sign = (i & 0x8000000000000000ull) >> 63;
+		if (expo == 0) {
+			double m = sign ? -static_cast<double>(mant) : static_cast<double>(mant);
+			int e = static_cast<int>(expo) - 1023 + 1 - 53;
+			double f = std::ldexp(m, e);
+			return static_cast<float64>(f);
+		} else {
+			mant |= 0x0010000000000000ull;
+			double m = sign ? -static_cast<double>(mant) : static_cast<double>(mant);
+			int e = static_cast<int>(expo) - 1023 + 1 - 53;
+			double f = std::ldexp(m, e);
+			return static_cast<float64>(f);
+		}
+	}
+}
+
+
+// template parameters are byte indices corresponding to the individual bytes of iee754 in memory
+template <std::size_t hihi, std::size_t hilo, std::size_t lohi, std::size_t lolo>
+struct IEEE754binary32Emulated {
+public:
+	using self_t = IEEE754binary32Emulated<hihi, hilo, lohi, lolo>;
+	std::byte bytes[4];
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		return bytes[i];
+	}
+	IEEE754binary32Emulated() = default;
+	MPT_FORCEINLINE explicit IEEE754binary32Emulated(float32 f) {
+		SetInt32(EncodeIEEE754binary32(f));
+	}
+	// b0...b3 are in memory order, i.e. depend on the endianness of this type
+	// little endian: (0x00,0x00,0x80,0x3f)
+	// big endian:    (0x3f,0x80,0x00,0x00)
+	MPT_FORCEINLINE explicit IEEE754binary32Emulated(std::byte b0, std::byte b1, std::byte b2, std::byte b3) {
+		bytes[0] = b0;
+		bytes[1] = b1;
+		bytes[2] = b2;
+		bytes[3] = b3;
+	}
+	MPT_FORCEINLINE operator float32() const {
+		return DecodeIEEE754binary32(GetInt32());
+	}
+	MPT_FORCEINLINE self_t & SetInt32(uint32 i) {
+		bytes[hihi] = static_cast<std::byte>(i >> 24);
+		bytes[hilo] = static_cast<std::byte>(i >> 16);
+		bytes[lohi] = static_cast<std::byte>(i >> 8);
+		bytes[lolo] = static_cast<std::byte>(i >> 0);
+		return *this;
+	}
+	MPT_FORCEINLINE uint32 GetInt32() const {
+		return 0u
+			| (static_cast<uint32>(bytes[hihi]) << 24)
+			| (static_cast<uint32>(bytes[hilo]) << 16)
+			| (static_cast<uint32>(bytes[lohi]) << 8)
+			| (static_cast<uint32>(bytes[lolo]) << 0);
+	}
+	MPT_FORCEINLINE bool operator==(const self_t & cmp) const {
+		return true
+			&& bytes[0] == cmp.bytes[0]
+			&& bytes[1] == cmp.bytes[1]
+			&& bytes[2] == cmp.bytes[2]
+			&& bytes[3] == cmp.bytes[3];
+	}
+	MPT_FORCEINLINE bool operator!=(const self_t & cmp) const {
+		return !(*this == cmp);
+	}
+};
+template <std::size_t hihihi, std::size_t hihilo, std::size_t hilohi, std::size_t hilolo, std::size_t lohihi, std::size_t lohilo, std::size_t lolohi, std::size_t lololo>
+struct IEEE754binary64Emulated {
+public:
+	using self_t = IEEE754binary64Emulated<hihihi, hihilo, hilohi, hilolo, lohihi, lohilo, lolohi, lololo>;
+	std::byte bytes[8];
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		return bytes[i];
+	}
+	IEEE754binary64Emulated() = default;
+	MPT_FORCEINLINE explicit IEEE754binary64Emulated(float64 f) {
+		SetInt64(EncodeIEEE754binary64(f));
+	}
+	MPT_FORCEINLINE explicit IEEE754binary64Emulated(std::byte b0, std::byte b1, std::byte b2, std::byte b3, std::byte b4, std::byte b5, std::byte b6, std::byte b7) {
+		bytes[0] = b0;
+		bytes[1] = b1;
+		bytes[2] = b2;
+		bytes[3] = b3;
+		bytes[4] = b4;
+		bytes[5] = b5;
+		bytes[6] = b6;
+		bytes[7] = b7;
+	}
+	MPT_FORCEINLINE operator float64() const {
+		return DecodeIEEE754binary64(GetInt64());
+	}
+	MPT_FORCEINLINE self_t & SetInt64(uint64 i) {
+		bytes[hihihi] = static_cast<std::byte>(i >> 56);
+		bytes[hihilo] = static_cast<std::byte>(i >> 48);
+		bytes[hilohi] = static_cast<std::byte>(i >> 40);
+		bytes[hilolo] = static_cast<std::byte>(i >> 32);
+		bytes[lohihi] = static_cast<std::byte>(i >> 24);
+		bytes[lohilo] = static_cast<std::byte>(i >> 16);
+		bytes[lolohi] = static_cast<std::byte>(i >> 8);
+		bytes[lololo] = static_cast<std::byte>(i >> 0);
+		return *this;
+	}
+	MPT_FORCEINLINE uint64 GetInt64() const {
+		return 0u
+			| (static_cast<uint64>(bytes[hihihi]) << 56)
+			| (static_cast<uint64>(bytes[hihilo]) << 48)
+			| (static_cast<uint64>(bytes[hilohi]) << 40)
+			| (static_cast<uint64>(bytes[hilolo]) << 32)
+			| (static_cast<uint64>(bytes[lohihi]) << 24)
+			| (static_cast<uint64>(bytes[lohilo]) << 16)
+			| (static_cast<uint64>(bytes[lolohi]) << 8)
+			| (static_cast<uint64>(bytes[lololo]) << 0);
+	}
+	MPT_FORCEINLINE bool operator==(const self_t & cmp) const {
+		return true
+			&& bytes[0] == cmp.bytes[0]
+			&& bytes[1] == cmp.bytes[1]
+			&& bytes[2] == cmp.bytes[2]
+			&& bytes[3] == cmp.bytes[3]
+			&& bytes[4] == cmp.bytes[4]
+			&& bytes[5] == cmp.bytes[5]
+			&& bytes[6] == cmp.bytes[6]
+			&& bytes[7] == cmp.bytes[7];
+	}
+	MPT_FORCEINLINE bool operator!=(const self_t & cmp) const {
+		return !(*this == cmp);
+	}
+};
+
+using IEEE754binary32EmulatedBE = IEEE754binary32Emulated<0, 1, 2, 3>;
+using IEEE754binary32EmulatedLE = IEEE754binary32Emulated<3, 2, 1, 0>;
+using IEEE754binary64EmulatedBE = IEEE754binary64Emulated<0, 1, 2, 3, 4, 5, 6, 7>;
+using IEEE754binary64EmulatedLE = IEEE754binary64Emulated<7, 6, 5, 4, 3, 2, 1, 0>;
+
+constexpr bool declare_binary_safe(const IEEE754binary32EmulatedBE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary32EmulatedLE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64EmulatedBE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64EmulatedLE &) {
+	return true;
+}
+
+static_assert(mpt::check_binary_size<IEEE754binary32EmulatedBE>(4));
+static_assert(mpt::check_binary_size<IEEE754binary32EmulatedLE>(4));
+static_assert(mpt::check_binary_size<IEEE754binary64EmulatedBE>(8));
+static_assert(mpt::check_binary_size<IEEE754binary64EmulatedLE>(8));
+
+template <mpt::endian endian = mpt::endian::native>
+struct IEEE754binary32Native {
+public:
+	float32 value;
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			return static_cast<std::byte>(EncodeIEEE754binary32(value) >> (i * 8));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			return static_cast<std::byte>(EncodeIEEE754binary32(value) >> ((4 - 1 - i) * 8));
+		}
+	}
+	IEEE754binary32Native() = default;
+	MPT_FORCEINLINE explicit IEEE754binary32Native(float32 f) {
+		value = f;
+	}
+	// b0...b3 are in memory order, i.e. depend on the endianness of this type
+	// little endian: (0x00,0x00,0x80,0x3f)
+	// big endian:    (0x3f,0x80,0x00,0x00)
+	MPT_FORCEINLINE explicit IEEE754binary32Native(std::byte b0, std::byte b1, std::byte b2, std::byte b3) {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			value = DecodeIEEE754binary32(0u | (static_cast<uint32>(b0) << 0) | (static_cast<uint32>(b1) << 8) | (static_cast<uint32>(b2) << 16) | (static_cast<uint32>(b3) << 24));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			value = DecodeIEEE754binary32(0u | (static_cast<uint32>(b0) << 24) | (static_cast<uint32>(b1) << 16) | (static_cast<uint32>(b2) << 8) | (static_cast<uint32>(b3) << 0));
+		}
+	}
+	MPT_FORCEINLINE operator float32() const {
+		return value;
+	}
+	MPT_FORCEINLINE IEEE754binary32Native & SetInt32(uint32 i) {
+		value = DecodeIEEE754binary32(i);
+		return *this;
+	}
+	MPT_FORCEINLINE uint32 GetInt32() const {
+		return EncodeIEEE754binary32(value);
+	}
+	MPT_FORCEINLINE bool operator==(const IEEE754binary32Native & cmp) const {
+		return value == cmp.value;
+	}
+	MPT_FORCEINLINE bool operator!=(const IEEE754binary32Native & cmp) const {
+		return value != cmp.value;
+	}
+};
+
+template <mpt::endian endian = mpt::endian::native>
+struct IEEE754binary64Native {
+public:
+	float64 value;
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			return mpt::byte_cast<std::byte>(static_cast<uint8>(EncodeIEEE754binary64(value) >> (i * 8)));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			return mpt::byte_cast<std::byte>(static_cast<uint8>(EncodeIEEE754binary64(value) >> ((8 - 1 - i) * 8)));
+		}
+	}
+	IEEE754binary64Native() = default;
+	MPT_FORCEINLINE explicit IEEE754binary64Native(float64 f) {
+		value = f;
+	}
+	MPT_FORCEINLINE explicit IEEE754binary64Native(std::byte b0, std::byte b1, std::byte b2, std::byte b3, std::byte b4, std::byte b5, std::byte b6, std::byte b7) {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			value = DecodeIEEE754binary64(0ull | (static_cast<uint64>(b0) << 0) | (static_cast<uint64>(b1) << 8) | (static_cast<uint64>(b2) << 16) | (static_cast<uint64>(b3) << 24) | (static_cast<uint64>(b4) << 32) | (static_cast<uint64>(b5) << 40) | (static_cast<uint64>(b6) << 48) | (static_cast<uint64>(b7) << 56));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			value = DecodeIEEE754binary64(0ull | (static_cast<uint64>(b0) << 56) | (static_cast<uint64>(b1) << 48) | (static_cast<uint64>(b2) << 40) | (static_cast<uint64>(b3) << 32) | (static_cast<uint64>(b4) << 24) | (static_cast<uint64>(b5) << 16) | (static_cast<uint64>(b6) << 8) | (static_cast<uint64>(b7) << 0));
+		}
+	}
+	MPT_FORCEINLINE operator float64() const {
+		return value;
+	}
+	MPT_FORCEINLINE IEEE754binary64Native & SetInt64(uint64 i) {
+		value = DecodeIEEE754binary64(i);
+		return *this;
+	}
+	MPT_FORCEINLINE uint64 GetInt64() const {
+		return EncodeIEEE754binary64(value);
+	}
+	MPT_FORCEINLINE bool operator==(const IEEE754binary64Native & cmp) const {
+		return value == cmp.value;
+	}
+	MPT_FORCEINLINE bool operator!=(const IEEE754binary64Native & cmp) const {
+		return value != cmp.value;
+	}
+};
+
+static_assert((sizeof(IEEE754binary32Native<>) == 4));
+static_assert((sizeof(IEEE754binary64Native<>) == 8));
+
+constexpr bool declare_binary_safe(const IEEE754binary32Native<> &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64Native<> &) noexcept {
+	return true;
+}
+
+template <bool is_ieee754, mpt::endian endian = mpt::endian::native>
+struct IEEE754binary_types {
+	using IEEE754binary32LE = IEEE754binary32EmulatedLE;
+	using IEEE754binary32BE = IEEE754binary32EmulatedBE;
+	using IEEE754binary64LE = IEEE754binary64EmulatedLE;
+	using IEEE754binary64BE = IEEE754binary64EmulatedBE;
+};
+template <>
+struct IEEE754binary_types<true, mpt::endian::little> {
+	using IEEE754binary32LE = IEEE754binary32Native<>;
+	using IEEE754binary32BE = IEEE754binary32EmulatedBE;
+	using IEEE754binary64LE = IEEE754binary64Native<>;
+	using IEEE754binary64BE = IEEE754binary64EmulatedBE;
+};
+template <>
+struct IEEE754binary_types<true, mpt::endian::big> {
+	using IEEE754binary32LE = IEEE754binary32EmulatedLE;
+	using IEEE754binary32BE = IEEE754binary32Native<>;
+	using IEEE754binary64LE = IEEE754binary64EmulatedLE;
+	using IEEE754binary64BE = IEEE754binary64Native<>;
+};
+
+using IEEE754binary32LE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32LE;
+using IEEE754binary32BE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32BE;
+using IEEE754binary64LE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64LE;
+using IEEE754binary64BE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64BE;
+
+static_assert(sizeof(IEEE754binary32LE) == 4);
+static_assert(sizeof(IEEE754binary32BE) == 4);
+static_assert(sizeof(IEEE754binary64LE) == 8);
+static_assert(sizeof(IEEE754binary64BE) == 8);
+
+
+// unaligned
+
+using float32le = IEEE754binary32EmulatedLE;
+using float32be = IEEE754binary32EmulatedBE;
+using float64le = IEEE754binary64EmulatedLE;
+using float64be = IEEE754binary64EmulatedBE;
+
+static_assert(sizeof(float32le) == 4);
+static_assert(sizeof(float32be) == 4);
+static_assert(sizeof(float64le) == 8);
+static_assert(sizeof(float64be) == 8);
+
+
+// potentially aligned
+
+using float32le_fast = IEEE754binary32LE;
+using float32be_fast = IEEE754binary32BE;
+using float64le_fast = IEEE754binary64LE;
+using float64be_fast = IEEE754binary64BE;
+
+static_assert(sizeof(float32le_fast) == 4);
+static_assert(sizeof(float32be_fast) == 4);
+static_assert(sizeof(float64le_fast) == 8);
+static_assert(sizeof(float64be_fast) == 8);
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_FLOATINGPOINT_HPP

Property changes on: src/mpt/endian/floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/integer.hpp
===================================================================
--- src/mpt/endian/integer.hpp	(nonexistent)
+++ src/mpt/endian/integer.hpp	(working copy)
@@ -0,0 +1,487 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_INTEGER_HPP
+#define MPT_ENDIAN_INTEGER_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/bit.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#include <limits>
+#include <type_traits>
+
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+
+#if MPT_COMPILER_MSVC
+#include <intrin.h>
+#endif
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+struct BigEndian_tag {
+	static constexpr mpt::endian endian = mpt::endian::big;
+};
+
+struct LittleEndian_tag {
+	static constexpr mpt::endian endian = mpt::endian::little;
+};
+
+
+
+constexpr inline uint16 constexpr_bswap16(uint16 x) noexcept {
+	return uint16(0)
+		| ((x >> 8) & 0x00FFu)
+		| ((x << 8) & 0xFF00u);
+}
+
+constexpr inline uint32 constexpr_bswap32(uint32 x) noexcept {
+	return uint32(0)
+		| ((x & 0x000000FFu) << 24)
+		| ((x & 0x0000FF00u) << 8)
+		| ((x & 0x00FF0000u) >> 8)
+		| ((x & 0xFF000000u) >> 24);
+}
+
+constexpr inline uint64 constexpr_bswap64(uint64 x) noexcept {
+	return uint64(0)
+		| (((x >> 0) & 0xffull) << 56)
+		| (((x >> 8) & 0xffull) << 48)
+		| (((x >> 16) & 0xffull) << 40)
+		| (((x >> 24) & 0xffull) << 32)
+		| (((x >> 32) & 0xffull) << 24)
+		| (((x >> 40) & 0xffull) << 16)
+		| (((x >> 48) & 0xffull) << 8)
+		| (((x >> 56) & 0xffull) << 0);
+}
+
+#if MPT_COMPILER_GCC
+#define MPT_bswap16 __builtin_bswap16
+#define MPT_bswap32 __builtin_bswap32
+#define MPT_bswap64 __builtin_bswap64
+#elif MPT_COMPILER_MSVC
+#define MPT_bswap16 _byteswap_ushort
+#define MPT_bswap32 _byteswap_ulong
+#define MPT_bswap64 _byteswap_uint64
+#endif
+
+// No intrinsics available
+#ifndef MPT_bswap16
+#define MPT_bswap16(x) mpt::constexpr_bswap16(x)
+#endif
+#ifndef MPT_bswap32
+#define MPT_bswap32(x) mpt::constexpr_bswap32(x)
+#endif
+#ifndef MPT_bswap64
+#define MPT_bswap64(x) mpt::constexpr_bswap64(x)
+#endif
+
+
+
+template <typename T, typename Tendian, std::size_t size>
+MPT_CONSTEXPRINLINE std::array<std::byte, size> EndianEncode(T val) noexcept {
+	static_assert(Tendian::endian == mpt::endian::little || Tendian::endian == mpt::endian::big);
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(!std::numeric_limits<T>::is_signed);
+	static_assert(sizeof(T) == size);
+	using base_type = T;
+	using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+	using endian_type = Tendian;
+	unsigned_base_type uval = static_cast<unsigned_base_type>(val);
+	std::array<std::byte, size> data{};
+	if constexpr (endian_type::endian == mpt::endian::little) {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			data[i] = static_cast<std::byte>(static_cast<uint8>((uval >> (i * 8)) & 0xffu));
+		}
+	} else {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			data[(sizeof(base_type) - 1) - i] = static_cast<std::byte>(static_cast<uint8>((uval >> (i * 8)) & 0xffu));
+		}
+	}
+	return data;
+}
+
+template <typename T, typename Tendian, std::size_t size>
+MPT_CONSTEXPRINLINE T EndianDecode(std::array<std::byte, size> data) noexcept {
+	static_assert(Tendian::endian == mpt::endian::little || Tendian::endian == mpt::endian::big);
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(!std::numeric_limits<T>::is_signed);
+	static_assert(sizeof(T) == size);
+	using base_type = T;
+	using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+	using endian_type = Tendian;
+	base_type val = base_type();
+	unsigned_base_type uval = unsigned_base_type();
+	if constexpr (endian_type::endian == mpt::endian::little) {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			uval |= static_cast<unsigned_base_type>(static_cast<uint8>(data[i])) << (i * 8);
+		}
+	} else {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			uval |= static_cast<unsigned_base_type>(static_cast<uint8>(data[(sizeof(base_type) - 1) - i])) << (i * 8);
+		}
+	}
+	val = static_cast<base_type>(uval);
+	return val;
+}
+
+
+MPT_CONSTEXPR20_FUN uint64 SwapBytesImpl(uint64 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap64(value);
+	}
+	else {
+		return MPT_bswap64(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN uint32 SwapBytesImpl(uint32 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap32(value);
+	}
+	else {
+		return MPT_bswap32(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN uint16 SwapBytesImpl(uint16 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap16(value);
+	}
+	else {
+		return MPT_bswap16(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int64 SwapBytesImpl(int64 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap64(value);
+	}
+	else {
+		return MPT_bswap64(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int32 SwapBytesImpl(int32 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap32(value);
+	}
+	else {
+		return MPT_bswap32(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int16 SwapBytesImpl(int16 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap16(value);
+	}
+	else {
+		return MPT_bswap16(value);
+	}
+}
+
+// Do NOT remove these overloads, even if they seem useless.
+// We do not want risking to extend 8bit integers to int and then
+// endian-converting and casting back to int.
+// Thus these overloads.
+
+MPT_CONSTEXPR20_FUN uint8 SwapBytesImpl(uint8 value) noexcept {
+	return value;
+}
+
+MPT_CONSTEXPR20_FUN int8 SwapBytesImpl(int8 value) noexcept {
+	return value;
+}
+
+MPT_CONSTEXPR20_FUN char SwapBytesImpl(char value) noexcept {
+	return value;
+}
+
+#undef MPT_bswap16
+#undef MPT_bswap32
+#undef MPT_bswap64
+
+
+
+// On-disk integer types with defined endianness and no alignemnt requirements
+// Note: To easily debug module loaders (and anything else that uses this
+// wrapper struct), you can use the Debugger Visualizers available in
+// build/vs/debug/ to conveniently view the wrapped contents.
+
+template <typename T, typename Tendian>
+struct packed {
+public:
+	using base_type = T;
+	using endian_type = Tendian;
+
+public:
+	std::array<std::byte, sizeof(base_type)> data;
+
+public:
+	MPT_CONSTEXPR20_FUN void set(base_type val) noexcept {
+		static_assert(std::numeric_limits<T>::is_integer);
+		MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+			if constexpr (endian_type::endian == mpt::endian::big) {
+				typename std::make_unsigned<base_type>::type uval = val;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					data[i] = static_cast<std::byte>((uval >> (8 * (sizeof(base_type) - 1 - i))) & 0xffu);
+				}
+			} else {
+				typename std::make_unsigned<base_type>::type uval = val;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					data[i] = static_cast<std::byte>((uval >> (8 * i)) & 0xffu);
+				}
+			}
+		}
+		else {
+			if constexpr (mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big) {
+				if constexpr (mpt::endian::native != endian_type::endian) {
+					val = mpt::SwapBytesImpl(val);
+				}
+				std::memcpy(data.data(), &val, sizeof(val));
+			} else {
+				using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+				data = EndianEncode<unsigned_base_type, Tendian, sizeof(T)>(val);
+			}
+		}
+	}
+	MPT_CONSTEXPR20_FUN base_type get() const noexcept {
+		static_assert(std::numeric_limits<T>::is_integer);
+		MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+			if constexpr (endian_type::endian == mpt::endian::big) {
+				typename std::make_unsigned<base_type>::type uval = 0;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					uval |= static_cast<typename std::make_unsigned<base_type>::type>(data[i]) << (8 * (sizeof(base_type) - 1 - i));
+				}
+				return static_cast<base_type>(uval);
+			} else {
+				typename std::make_unsigned<base_type>::type uval = 0;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					uval |= static_cast<typename std::make_unsigned<base_type>::type>(data[i]) << (8 * i);
+				}
+				return static_cast<base_type>(uval);
+			}
+		}
+		else {
+			if constexpr (mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big) {
+				base_type val = base_type();
+				std::memcpy(&val, data.data(), sizeof(val));
+				if constexpr (mpt::endian::native != endian_type::endian) {
+					val = mpt::SwapBytesImpl(val);
+				}
+				return val;
+			} else {
+				using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+				return EndianDecode<unsigned_base_type, Tendian, sizeof(T)>(data);
+			}
+		}
+	}
+	MPT_CONSTEXPR20_FUN packed & operator=(const base_type & val) noexcept {
+		set(val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN operator base_type() const noexcept {
+		return get();
+	}
+
+public:
+	MPT_CONSTEXPR20_FUN packed & operator&=(base_type val) noexcept {
+		set(get() & val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator|=(base_type val) noexcept {
+		set(get() | val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator^=(base_type val) noexcept {
+		set(get() ^ val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator+=(base_type val) noexcept {
+		set(get() + val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator-=(base_type val) noexcept {
+		set(get() - val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator*=(base_type val) noexcept {
+		set(get() * val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator/=(base_type val) noexcept {
+		set(get() / val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator%=(base_type val) noexcept {
+		set(get() % val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator++() noexcept { // prefix
+		set(get() + 1);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator--() noexcept { // prefix
+		set(get() - 1);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN base_type operator++(int) noexcept { // postfix
+		base_type old = get();
+		set(old + 1);
+		return old;
+	}
+	MPT_CONSTEXPR20_FUN base_type operator--(int) noexcept { // postfix
+		base_type old = get();
+		set(old - 1);
+		return old;
+	}
+};
+
+using int64le = packed<int64, LittleEndian_tag>;
+using int32le = packed<int32, LittleEndian_tag>;
+using int16le = packed<int16, LittleEndian_tag>;
+using int8le = packed<int8, LittleEndian_tag>;
+using uint64le = packed<uint64, LittleEndian_tag>;
+using uint32le = packed<uint32, LittleEndian_tag>;
+using uint16le = packed<uint16, LittleEndian_tag>;
+using uint8le = packed<uint8, LittleEndian_tag>;
+
+using int64be = packed<int64, BigEndian_tag>;
+using int32be = packed<int32, BigEndian_tag>;
+using int16be = packed<int16, BigEndian_tag>;
+using int8be = packed<int8, BigEndian_tag>;
+using uint64be = packed<uint64, BigEndian_tag>;
+using uint32be = packed<uint32, BigEndian_tag>;
+using uint16be = packed<uint16, BigEndian_tag>;
+using uint8be = packed<uint8, BigEndian_tag>;
+
+constexpr bool declare_binary_safe(const int64le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int32le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int16le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint64le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint32le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint16le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8le &) {
+	return true;
+}
+
+constexpr bool declare_binary_safe(const int64be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int32be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int16be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint64be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint32be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint16be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8be &) {
+	return true;
+}
+
+static_assert(mpt::check_binary_size<int64le>(8));
+static_assert(mpt::check_binary_size<int32le>(4));
+static_assert(mpt::check_binary_size<int16le>(2));
+static_assert(mpt::check_binary_size<int8le>(1));
+static_assert(mpt::check_binary_size<uint64le>(8));
+static_assert(mpt::check_binary_size<uint32le>(4));
+static_assert(mpt::check_binary_size<uint16le>(2));
+static_assert(mpt::check_binary_size<uint8le>(1));
+
+static_assert(mpt::check_binary_size<int64be>(8));
+static_assert(mpt::check_binary_size<int32be>(4));
+static_assert(mpt::check_binary_size<int16be>(2));
+static_assert(mpt::check_binary_size<int8be>(1));
+static_assert(mpt::check_binary_size<uint64be>(8));
+static_assert(mpt::check_binary_size<uint32be>(4));
+static_assert(mpt::check_binary_size<uint16be>(2));
+static_assert(mpt::check_binary_size<uint8be>(1));
+
+
+
+template <typename T>
+struct make_le {
+	using type = packed<typename std::remove_const<T>::type, LittleEndian_tag>;
+};
+
+template <typename T>
+struct make_be {
+	using type = packed<typename std::remove_const<T>::type, BigEndian_tag>;
+};
+
+template <typename T>
+MPT_CONSTEXPR20_FUN auto as_le(T v) noexcept -> typename mpt::make_le<typename std::remove_const<T>::type>::type {
+	typename mpt::make_le<typename std::remove_const<T>::type>::type res{};
+	res = v;
+	return res;
+}
+
+template <typename T>
+MPT_CONSTEXPR20_FUN auto as_be(T v) noexcept -> typename mpt::make_be<typename std::remove_const<T>::type>::type {
+	typename mpt::make_be<typename std::remove_const<T>::type>::type res{};
+	res = v;
+	return res;
+}
+
+template <typename Tpacked>
+MPT_CONSTEXPR20_FUN Tpacked as_endian(typename Tpacked::base_type v) noexcept {
+	Tpacked res{};
+	res = v;
+	return res;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+namespace std {
+template <typename T, typename Tendian>
+class numeric_limits<mpt::packed<T, Tendian>> : public std::numeric_limits<T> { };
+template <typename T, typename Tendian>
+class numeric_limits<const mpt::packed<T, Tendian>> : public std::numeric_limits<const T> { };
+} // namespace std
+
+
+
+#endif // MPT_ENDIAN_INTEGER_HPP

Property changes on: src/mpt/endian/integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/tests/tests_endian_floatingpoint.hpp
===================================================================
--- src/mpt/endian/tests/tests_endian_floatingpoint.hpp	(nonexistent)
+++ src/mpt/endian/tests/tests_endian_floatingpoint.hpp	(working copy)
@@ -0,0 +1,66 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP
+#define MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/floatingpoint.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_endian_floatingpoint{
+	"mpt/endian/floatingpoint",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary32(1.0f), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary32(-1.0f), 0xbf800000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x00000000u), 0.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x41840000u), 16.5f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3faa0000u), 1.328125f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0xbfaa0000u), -1.328125f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3f800000u), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x00000000u), 0.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0xbf800000u), -1.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3f800000u), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(1.0f).GetInt32(), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(1.0f).GetInt32(), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x80), mpt::as_byte(0x3f)), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(mpt::as_byte(0x3f), mpt::as_byte(0x80), mpt::as_byte(0x00), mpt::as_byte(0x00)), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(1.0f), IEEE754binary32LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x80), mpt::as_byte(0x3f)));
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(1.0f), IEEE754binary32BE(mpt::as_byte(0x3f), mpt::as_byte(0x80), mpt::as_byte(0x00), mpt::as_byte(0x00)));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary64(1.0), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary64(-1.0), 0xbff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x4030800000000000ull), 16.5);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3FF5400000000000ull), 1.328125);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0xBFF5400000000000ull), -1.328125);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3ff0000000000000ull), 1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0xbff0000000000000ull), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3ff0000000000000ull), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(1.0).GetInt64(), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(1.0).GetInt64(), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0xf0), mpt::as_byte(0x3f)), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(mpt::as_byte(0x3f), mpt::as_byte(0xf0), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00)), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(1.0), IEEE754binary64LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0xf0), mpt::as_byte(0x3f)));
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(1.0), IEEE754binary64BE(mpt::as_byte(0x3f), mpt::as_byte(0xf0), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00)));
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP

Property changes on: src/mpt/endian/tests/tests_endian_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/tests/tests_endian_integer.hpp
===================================================================
--- src/mpt/endian/tests/tests_endian_integer.hpp	(nonexistent)
+++ src/mpt/endian/tests/tests_endian_integer.hpp	(working copy)
@@ -0,0 +1,118 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP
+#define MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_endian_integer{
+	"mpt/endian/integer",
+	[](mpt::test::context & context) {
+		static_assert(std::numeric_limits<int8le>::min() == std::numeric_limits<int8>::min());
+		static_assert(std::numeric_limits<uint8le>::min() == std::numeric_limits<uint8>::min());
+
+		static_assert(std::numeric_limits<int16le>::min() == std::numeric_limits<int16>::min());
+		static_assert(std::numeric_limits<uint16le>::min() == std::numeric_limits<uint16>::min());
+
+		static_assert(std::numeric_limits<int32le>::min() == std::numeric_limits<int32>::min());
+		static_assert(std::numeric_limits<uint32le>::min() == std::numeric_limits<uint32>::min());
+
+		static_assert(std::numeric_limits<int64le>::min() == std::numeric_limits<int64>::min());
+		static_assert(std::numeric_limits<uint64le>::min() == std::numeric_limits<uint64>::min());
+
+		static_assert(std::numeric_limits<int8le>::max() == std::numeric_limits<int8>::max());
+		static_assert(std::numeric_limits<uint8le>::max() == std::numeric_limits<uint8>::max());
+
+		static_assert(std::numeric_limits<int16le>::max() == std::numeric_limits<int16>::max());
+		static_assert(std::numeric_limits<uint16le>::max() == std::numeric_limits<uint16>::max());
+
+		static_assert(std::numeric_limits<int32le>::max() == std::numeric_limits<int32>::max());
+		static_assert(std::numeric_limits<uint32le>::max() == std::numeric_limits<uint32>::max());
+
+		static_assert(std::numeric_limits<int64le>::max() == std::numeric_limits<int64>::max());
+		static_assert(std::numeric_limits<uint64le>::max() == std::numeric_limits<uint64>::max());
+
+		struct test_endian_constexpr {
+			static MPT_CONSTEXPR20_FUN int32le test(uint32 x) {
+				int32le foo{};
+				foo = x;
+				return foo;
+			}
+		};
+
+		MPT_CONSTEXPR20_VAR int32le foo = test_endian_constexpr::test(23);
+		static_cast<void>(foo);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint8(0x12)), 0x12);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint16(0x1234)), 0x3412);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint32(0x12345678u)), 0x78563412u);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint64(0x123456789abcdef0ull)), 0xf0debc9a78563412ull);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int8(std::numeric_limits<int8>::min())), std::numeric_limits<int8>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int16(std::numeric_limits<int16>::min())), int16(0x80));
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int32(std::numeric_limits<int32>::min())), int32(0x80));
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int64(std::numeric_limits<int64>::min())), int64(0x80));
+
+		// Packed integers with defined endianness
+		{
+			int8le le8;
+			le8.set(-128);
+			int8be be8;
+			be8.set(-128);
+			MPT_TEST_EXPECT_EQUAL(le8, -128);
+			MPT_TEST_EXPECT_EQUAL(be8, -128);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le8, "\x80", 1), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be8, "\x80", 1), 0);
+			int16le le16;
+			le16.set(0x1234);
+			int16be be16;
+			be16.set(0x1234);
+			MPT_TEST_EXPECT_EQUAL(le16, 0x1234);
+			MPT_TEST_EXPECT_EQUAL(be16, 0x1234);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le16, "\x34\x12", 2), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be16, "\x12\x34", 2), 0);
+			uint32le le32;
+			le32.set(0xFFEEDDCCu);
+			uint32be be32;
+			be32.set(0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(le32, 0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(be32, 0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le32, "\xCC\xDD\xEE\xFF", 4), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be32, "\xFF\xEE\xDD\xCC", 4), 0);
+			uint64le le64;
+			le64.set(0xDEADC0DE15C0FFEEull);
+			uint64be be64;
+			be64.set(0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(le64, 0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(be64, 0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le64, "\xEE\xFF\xC0\x15\xDE\xC0\xAD\xDE", 8), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be64, "\xDE\xAD\xC0\xDE\x15\xC0\xFF\xEE", 8), 0);
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP

Property changes on: src/mpt/endian/tests/tests_endian_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/floatingpoint.hpp
===================================================================
--- src/mpt/endian/floatingpoint.hpp	(nonexistent)
+++ src/mpt/endian/floatingpoint.hpp	(working copy)
@@ -0,0 +1,441 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_FLOATINGPOINT_HPP
+#define MPT_ENDIAN_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/floatingpoint.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <limits>
+
+#include <cmath>
+#include <cstddef>
+#include <cstdint>
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+// 1.0f --> 0x3f800000u
+MPT_FORCEINLINE uint32 EncodeIEEE754binary32(float32 f) {
+	if constexpr (mpt::float_traits<float32>::is_ieee754_binary32ne) {
+		return mpt::bit_cast<uint32>(f);
+	} else {
+		int e = 0;
+		float m = std::frexp(f, &e);
+		if (e == 0 && std::fabs(m) == 0.0f) {
+			uint32 expo = 0u;
+			uint32 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint32 mant = 0u;
+			uint32 i = 0u;
+			i |= (mant << 0) & 0x007fffffu;
+			i |= (expo << 23) & 0x7f800000u;
+			i |= (sign << 31) & 0x80000000u;
+			return i;
+		} else {
+			uint32 expo = e + 127 - 1;
+			uint32 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint32 mant = static_cast<uint32>(std::fabs(std::ldexp(m, 24)));
+			uint32 i = 0u;
+			i |= (mant << 0) & 0x007fffffu;
+			i |= (expo << 23) & 0x7f800000u;
+			i |= (sign << 31) & 0x80000000u;
+			return i;
+		}
+	}
+}
+
+MPT_FORCEINLINE uint64 EncodeIEEE754binary64(float64 f) {
+	if constexpr (mpt::float_traits<float64>::is_ieee754_binary64ne) {
+		return mpt::bit_cast<uint64>(f);
+	} else {
+		int e = 0;
+		double m = std::frexp(f, &e);
+		if (e == 0 && std::fabs(m) == 0.0) {
+			uint64 expo = 0u;
+			uint64 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint64 mant = 0u;
+			uint64 i = 0u;
+			i |= (mant << 0) & 0x000fffffffffffffull;
+			i |= (expo << 52) & 0x7ff0000000000000ull;
+			i |= (sign << 63) & 0x8000000000000000ull;
+			return i;
+		} else {
+			uint64 expo = static_cast<int64>(e) + 1023 - 1;
+			uint64 sign = std::signbit(m) ? 0x01u : 0x00u;
+			uint64 mant = static_cast<uint64>(std::fabs(std::ldexp(m, 53)));
+			uint64 i = 0u;
+			i |= (mant << 0) & 0x000fffffffffffffull;
+			i |= (expo << 52) & 0x7ff0000000000000ull;
+			i |= (sign << 63) & 0x8000000000000000ull;
+			return i;
+		}
+	}
+}
+
+// 0x3f800000u --> 1.0f
+MPT_FORCEINLINE float32 DecodeIEEE754binary32(uint32 i) {
+	if constexpr (mpt::float_traits<float32>::is_ieee754_binary32ne) {
+		return mpt::bit_cast<float32>(i);
+	} else {
+		uint32 mant = (i & 0x007fffffu) >> 0;
+		uint32 expo = (i & 0x7f800000u) >> 23;
+		uint32 sign = (i & 0x80000000u) >> 31;
+		if (expo == 0) {
+			float m = sign ? -static_cast<float>(mant) : static_cast<float>(mant);
+			int e = static_cast<int>(expo) - 127 + 1 - 24;
+			float f = std::ldexp(m, e);
+			return static_cast<float32>(f);
+		} else {
+			mant |= 0x00800000u;
+			float m = sign ? -static_cast<float>(mant) : static_cast<float>(mant);
+			int e = static_cast<int>(expo) - 127 + 1 - 24;
+			float f = std::ldexp(m, e);
+			return static_cast<float32>(f);
+		}
+	}
+}
+
+MPT_FORCEINLINE float64 DecodeIEEE754binary64(uint64 i) {
+	if constexpr (mpt::float_traits<float64>::is_ieee754_binary64ne) {
+		return mpt::bit_cast<float64>(i);
+	} else {
+		uint64 mant = (i & 0x000fffffffffffffull) >> 0;
+		uint64 expo = (i & 0x7ff0000000000000ull) >> 52;
+		uint64 sign = (i & 0x8000000000000000ull) >> 63;
+		if (expo == 0) {
+			double m = sign ? -static_cast<double>(mant) : static_cast<double>(mant);
+			int e = static_cast<int>(expo) - 1023 + 1 - 53;
+			double f = std::ldexp(m, e);
+			return static_cast<float64>(f);
+		} else {
+			mant |= 0x0010000000000000ull;
+			double m = sign ? -static_cast<double>(mant) : static_cast<double>(mant);
+			int e = static_cast<int>(expo) - 1023 + 1 - 53;
+			double f = std::ldexp(m, e);
+			return static_cast<float64>(f);
+		}
+	}
+}
+
+
+// template parameters are byte indices corresponding to the individual bytes of iee754 in memory
+template <std::size_t hihi, std::size_t hilo, std::size_t lohi, std::size_t lolo>
+struct IEEE754binary32Emulated {
+public:
+	using self_t = IEEE754binary32Emulated<hihi, hilo, lohi, lolo>;
+	std::byte bytes[4];
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		return bytes[i];
+	}
+	IEEE754binary32Emulated() = default;
+	MPT_FORCEINLINE explicit IEEE754binary32Emulated(float32 f) {
+		SetInt32(EncodeIEEE754binary32(f));
+	}
+	// b0...b3 are in memory order, i.e. depend on the endianness of this type
+	// little endian: (0x00,0x00,0x80,0x3f)
+	// big endian:    (0x3f,0x80,0x00,0x00)
+	MPT_FORCEINLINE explicit IEEE754binary32Emulated(std::byte b0, std::byte b1, std::byte b2, std::byte b3) {
+		bytes[0] = b0;
+		bytes[1] = b1;
+		bytes[2] = b2;
+		bytes[3] = b3;
+	}
+	MPT_FORCEINLINE operator float32() const {
+		return DecodeIEEE754binary32(GetInt32());
+	}
+	MPT_FORCEINLINE self_t & SetInt32(uint32 i) {
+		bytes[hihi] = static_cast<std::byte>(i >> 24);
+		bytes[hilo] = static_cast<std::byte>(i >> 16);
+		bytes[lohi] = static_cast<std::byte>(i >> 8);
+		bytes[lolo] = static_cast<std::byte>(i >> 0);
+		return *this;
+	}
+	MPT_FORCEINLINE uint32 GetInt32() const {
+		return 0u
+			| (static_cast<uint32>(bytes[hihi]) << 24)
+			| (static_cast<uint32>(bytes[hilo]) << 16)
+			| (static_cast<uint32>(bytes[lohi]) << 8)
+			| (static_cast<uint32>(bytes[lolo]) << 0);
+	}
+	MPT_FORCEINLINE bool operator==(const self_t & cmp) const {
+		return true
+			&& bytes[0] == cmp.bytes[0]
+			&& bytes[1] == cmp.bytes[1]
+			&& bytes[2] == cmp.bytes[2]
+			&& bytes[3] == cmp.bytes[3];
+	}
+	MPT_FORCEINLINE bool operator!=(const self_t & cmp) const {
+		return !(*this == cmp);
+	}
+};
+template <std::size_t hihihi, std::size_t hihilo, std::size_t hilohi, std::size_t hilolo, std::size_t lohihi, std::size_t lohilo, std::size_t lolohi, std::size_t lololo>
+struct IEEE754binary64Emulated {
+public:
+	using self_t = IEEE754binary64Emulated<hihihi, hihilo, hilohi, hilolo, lohihi, lohilo, lolohi, lololo>;
+	std::byte bytes[8];
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		return bytes[i];
+	}
+	IEEE754binary64Emulated() = default;
+	MPT_FORCEINLINE explicit IEEE754binary64Emulated(float64 f) {
+		SetInt64(EncodeIEEE754binary64(f));
+	}
+	MPT_FORCEINLINE explicit IEEE754binary64Emulated(std::byte b0, std::byte b1, std::byte b2, std::byte b3, std::byte b4, std::byte b5, std::byte b6, std::byte b7) {
+		bytes[0] = b0;
+		bytes[1] = b1;
+		bytes[2] = b2;
+		bytes[3] = b3;
+		bytes[4] = b4;
+		bytes[5] = b5;
+		bytes[6] = b6;
+		bytes[7] = b7;
+	}
+	MPT_FORCEINLINE operator float64() const {
+		return DecodeIEEE754binary64(GetInt64());
+	}
+	MPT_FORCEINLINE self_t & SetInt64(uint64 i) {
+		bytes[hihihi] = static_cast<std::byte>(i >> 56);
+		bytes[hihilo] = static_cast<std::byte>(i >> 48);
+		bytes[hilohi] = static_cast<std::byte>(i >> 40);
+		bytes[hilolo] = static_cast<std::byte>(i >> 32);
+		bytes[lohihi] = static_cast<std::byte>(i >> 24);
+		bytes[lohilo] = static_cast<std::byte>(i >> 16);
+		bytes[lolohi] = static_cast<std::byte>(i >> 8);
+		bytes[lololo] = static_cast<std::byte>(i >> 0);
+		return *this;
+	}
+	MPT_FORCEINLINE uint64 GetInt64() const {
+		return 0u
+			| (static_cast<uint64>(bytes[hihihi]) << 56)
+			| (static_cast<uint64>(bytes[hihilo]) << 48)
+			| (static_cast<uint64>(bytes[hilohi]) << 40)
+			| (static_cast<uint64>(bytes[hilolo]) << 32)
+			| (static_cast<uint64>(bytes[lohihi]) << 24)
+			| (static_cast<uint64>(bytes[lohilo]) << 16)
+			| (static_cast<uint64>(bytes[lolohi]) << 8)
+			| (static_cast<uint64>(bytes[lololo]) << 0);
+	}
+	MPT_FORCEINLINE bool operator==(const self_t & cmp) const {
+		return true
+			&& bytes[0] == cmp.bytes[0]
+			&& bytes[1] == cmp.bytes[1]
+			&& bytes[2] == cmp.bytes[2]
+			&& bytes[3] == cmp.bytes[3]
+			&& bytes[4] == cmp.bytes[4]
+			&& bytes[5] == cmp.bytes[5]
+			&& bytes[6] == cmp.bytes[6]
+			&& bytes[7] == cmp.bytes[7];
+	}
+	MPT_FORCEINLINE bool operator!=(const self_t & cmp) const {
+		return !(*this == cmp);
+	}
+};
+
+using IEEE754binary32EmulatedBE = IEEE754binary32Emulated<0, 1, 2, 3>;
+using IEEE754binary32EmulatedLE = IEEE754binary32Emulated<3, 2, 1, 0>;
+using IEEE754binary64EmulatedBE = IEEE754binary64Emulated<0, 1, 2, 3, 4, 5, 6, 7>;
+using IEEE754binary64EmulatedLE = IEEE754binary64Emulated<7, 6, 5, 4, 3, 2, 1, 0>;
+
+constexpr bool declare_binary_safe(const IEEE754binary32EmulatedBE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary32EmulatedLE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64EmulatedBE &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64EmulatedLE &) {
+	return true;
+}
+
+static_assert(mpt::check_binary_size<IEEE754binary32EmulatedBE>(4));
+static_assert(mpt::check_binary_size<IEEE754binary32EmulatedLE>(4));
+static_assert(mpt::check_binary_size<IEEE754binary64EmulatedBE>(8));
+static_assert(mpt::check_binary_size<IEEE754binary64EmulatedLE>(8));
+
+template <mpt::endian endian = mpt::endian::native>
+struct IEEE754binary32Native {
+public:
+	float32 value;
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			return static_cast<std::byte>(EncodeIEEE754binary32(value) >> (i * 8));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			return static_cast<std::byte>(EncodeIEEE754binary32(value) >> ((4 - 1 - i) * 8));
+		}
+	}
+	IEEE754binary32Native() = default;
+	MPT_FORCEINLINE explicit IEEE754binary32Native(float32 f) {
+		value = f;
+	}
+	// b0...b3 are in memory order, i.e. depend on the endianness of this type
+	// little endian: (0x00,0x00,0x80,0x3f)
+	// big endian:    (0x3f,0x80,0x00,0x00)
+	MPT_FORCEINLINE explicit IEEE754binary32Native(std::byte b0, std::byte b1, std::byte b2, std::byte b3) {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			value = DecodeIEEE754binary32(0u | (static_cast<uint32>(b0) << 0) | (static_cast<uint32>(b1) << 8) | (static_cast<uint32>(b2) << 16) | (static_cast<uint32>(b3) << 24));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			value = DecodeIEEE754binary32(0u | (static_cast<uint32>(b0) << 24) | (static_cast<uint32>(b1) << 16) | (static_cast<uint32>(b2) << 8) | (static_cast<uint32>(b3) << 0));
+		}
+	}
+	MPT_FORCEINLINE operator float32() const {
+		return value;
+	}
+	MPT_FORCEINLINE IEEE754binary32Native & SetInt32(uint32 i) {
+		value = DecodeIEEE754binary32(i);
+		return *this;
+	}
+	MPT_FORCEINLINE uint32 GetInt32() const {
+		return EncodeIEEE754binary32(value);
+	}
+	MPT_FORCEINLINE bool operator==(const IEEE754binary32Native & cmp) const {
+		return value == cmp.value;
+	}
+	MPT_FORCEINLINE bool operator!=(const IEEE754binary32Native & cmp) const {
+		return value != cmp.value;
+	}
+};
+
+template <mpt::endian endian = mpt::endian::native>
+struct IEEE754binary64Native {
+public:
+	float64 value;
+
+public:
+	MPT_FORCEINLINE std::byte GetByte(std::size_t i) const {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			return mpt::byte_cast<std::byte>(static_cast<uint8>(EncodeIEEE754binary64(value) >> (i * 8)));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			return mpt::byte_cast<std::byte>(static_cast<uint8>(EncodeIEEE754binary64(value) >> ((8 - 1 - i) * 8)));
+		}
+	}
+	IEEE754binary64Native() = default;
+	MPT_FORCEINLINE explicit IEEE754binary64Native(float64 f) {
+		value = f;
+	}
+	MPT_FORCEINLINE explicit IEEE754binary64Native(std::byte b0, std::byte b1, std::byte b2, std::byte b3, std::byte b4, std::byte b5, std::byte b6, std::byte b7) {
+		static_assert(endian == mpt::endian::little || endian == mpt::endian::big);
+		if constexpr (endian == mpt::endian::little) {
+			value = DecodeIEEE754binary64(0ull | (static_cast<uint64>(b0) << 0) | (static_cast<uint64>(b1) << 8) | (static_cast<uint64>(b2) << 16) | (static_cast<uint64>(b3) << 24) | (static_cast<uint64>(b4) << 32) | (static_cast<uint64>(b5) << 40) | (static_cast<uint64>(b6) << 48) | (static_cast<uint64>(b7) << 56));
+		}
+		if constexpr (endian == mpt::endian::big) {
+			value = DecodeIEEE754binary64(0ull | (static_cast<uint64>(b0) << 56) | (static_cast<uint64>(b1) << 48) | (static_cast<uint64>(b2) << 40) | (static_cast<uint64>(b3) << 32) | (static_cast<uint64>(b4) << 24) | (static_cast<uint64>(b5) << 16) | (static_cast<uint64>(b6) << 8) | (static_cast<uint64>(b7) << 0));
+		}
+	}
+	MPT_FORCEINLINE operator float64() const {
+		return value;
+	}
+	MPT_FORCEINLINE IEEE754binary64Native & SetInt64(uint64 i) {
+		value = DecodeIEEE754binary64(i);
+		return *this;
+	}
+	MPT_FORCEINLINE uint64 GetInt64() const {
+		return EncodeIEEE754binary64(value);
+	}
+	MPT_FORCEINLINE bool operator==(const IEEE754binary64Native & cmp) const {
+		return value == cmp.value;
+	}
+	MPT_FORCEINLINE bool operator!=(const IEEE754binary64Native & cmp) const {
+		return value != cmp.value;
+	}
+};
+
+static_assert((sizeof(IEEE754binary32Native<>) == 4));
+static_assert((sizeof(IEEE754binary64Native<>) == 8));
+
+constexpr bool declare_binary_safe(const IEEE754binary32Native<> &) noexcept {
+	return true;
+}
+constexpr bool declare_binary_safe(const IEEE754binary64Native<> &) noexcept {
+	return true;
+}
+
+template <bool is_ieee754, mpt::endian endian = mpt::endian::native>
+struct IEEE754binary_types {
+	using IEEE754binary32LE = IEEE754binary32EmulatedLE;
+	using IEEE754binary32BE = IEEE754binary32EmulatedBE;
+	using IEEE754binary64LE = IEEE754binary64EmulatedLE;
+	using IEEE754binary64BE = IEEE754binary64EmulatedBE;
+};
+template <>
+struct IEEE754binary_types<true, mpt::endian::little> {
+	using IEEE754binary32LE = IEEE754binary32Native<>;
+	using IEEE754binary32BE = IEEE754binary32EmulatedBE;
+	using IEEE754binary64LE = IEEE754binary64Native<>;
+	using IEEE754binary64BE = IEEE754binary64EmulatedBE;
+};
+template <>
+struct IEEE754binary_types<true, mpt::endian::big> {
+	using IEEE754binary32LE = IEEE754binary32EmulatedLE;
+	using IEEE754binary32BE = IEEE754binary32Native<>;
+	using IEEE754binary64LE = IEEE754binary64EmulatedLE;
+	using IEEE754binary64BE = IEEE754binary64Native<>;
+};
+
+using IEEE754binary32LE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32LE;
+using IEEE754binary32BE = IEEE754binary_types<mpt::float_traits<float32>::is_ieee754_binary32ne, mpt::endian::native>::IEEE754binary32BE;
+using IEEE754binary64LE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64LE;
+using IEEE754binary64BE = IEEE754binary_types<mpt::float_traits<float64>::is_ieee754_binary64ne, mpt::endian::native>::IEEE754binary64BE;
+
+static_assert(sizeof(IEEE754binary32LE) == 4);
+static_assert(sizeof(IEEE754binary32BE) == 4);
+static_assert(sizeof(IEEE754binary64LE) == 8);
+static_assert(sizeof(IEEE754binary64BE) == 8);
+
+
+// unaligned
+
+using float32le = IEEE754binary32EmulatedLE;
+using float32be = IEEE754binary32EmulatedBE;
+using float64le = IEEE754binary64EmulatedLE;
+using float64be = IEEE754binary64EmulatedBE;
+
+static_assert(sizeof(float32le) == 4);
+static_assert(sizeof(float32be) == 4);
+static_assert(sizeof(float64le) == 8);
+static_assert(sizeof(float64be) == 8);
+
+
+// potentially aligned
+
+using float32le_fast = IEEE754binary32LE;
+using float32be_fast = IEEE754binary32BE;
+using float64le_fast = IEEE754binary64LE;
+using float64be_fast = IEEE754binary64BE;
+
+static_assert(sizeof(float32le_fast) == 4);
+static_assert(sizeof(float32be_fast) == 4);
+static_assert(sizeof(float64le_fast) == 8);
+static_assert(sizeof(float64be_fast) == 8);
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_FLOATINGPOINT_HPP

Property changes on: src/mpt/endian/floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/integer.hpp
===================================================================
--- src/mpt/endian/integer.hpp	(nonexistent)
+++ src/mpt/endian/integer.hpp	(working copy)
@@ -0,0 +1,487 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_INTEGER_HPP
+#define MPT_ENDIAN_INTEGER_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/bit.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+#include <limits>
+#include <type_traits>
+
+#include <cstddef>
+#include <cstdint>
+#include <cstring>
+
+#if MPT_COMPILER_MSVC
+#include <intrin.h>
+#endif
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+struct BigEndian_tag {
+	static constexpr mpt::endian endian = mpt::endian::big;
+};
+
+struct LittleEndian_tag {
+	static constexpr mpt::endian endian = mpt::endian::little;
+};
+
+
+
+constexpr inline uint16 constexpr_bswap16(uint16 x) noexcept {
+	return uint16(0)
+		| ((x >> 8) & 0x00FFu)
+		| ((x << 8) & 0xFF00u);
+}
+
+constexpr inline uint32 constexpr_bswap32(uint32 x) noexcept {
+	return uint32(0)
+		| ((x & 0x000000FFu) << 24)
+		| ((x & 0x0000FF00u) << 8)
+		| ((x & 0x00FF0000u) >> 8)
+		| ((x & 0xFF000000u) >> 24);
+}
+
+constexpr inline uint64 constexpr_bswap64(uint64 x) noexcept {
+	return uint64(0)
+		| (((x >> 0) & 0xffull) << 56)
+		| (((x >> 8) & 0xffull) << 48)
+		| (((x >> 16) & 0xffull) << 40)
+		| (((x >> 24) & 0xffull) << 32)
+		| (((x >> 32) & 0xffull) << 24)
+		| (((x >> 40) & 0xffull) << 16)
+		| (((x >> 48) & 0xffull) << 8)
+		| (((x >> 56) & 0xffull) << 0);
+}
+
+#if MPT_COMPILER_GCC
+#define MPT_bswap16 __builtin_bswap16
+#define MPT_bswap32 __builtin_bswap32
+#define MPT_bswap64 __builtin_bswap64
+#elif MPT_COMPILER_MSVC
+#define MPT_bswap16 _byteswap_ushort
+#define MPT_bswap32 _byteswap_ulong
+#define MPT_bswap64 _byteswap_uint64
+#endif
+
+// No intrinsics available
+#ifndef MPT_bswap16
+#define MPT_bswap16(x) mpt::constexpr_bswap16(x)
+#endif
+#ifndef MPT_bswap32
+#define MPT_bswap32(x) mpt::constexpr_bswap32(x)
+#endif
+#ifndef MPT_bswap64
+#define MPT_bswap64(x) mpt::constexpr_bswap64(x)
+#endif
+
+
+
+template <typename T, typename Tendian, std::size_t size>
+MPT_CONSTEXPRINLINE std::array<std::byte, size> EndianEncode(T val) noexcept {
+	static_assert(Tendian::endian == mpt::endian::little || Tendian::endian == mpt::endian::big);
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(!std::numeric_limits<T>::is_signed);
+	static_assert(sizeof(T) == size);
+	using base_type = T;
+	using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+	using endian_type = Tendian;
+	unsigned_base_type uval = static_cast<unsigned_base_type>(val);
+	std::array<std::byte, size> data{};
+	if constexpr (endian_type::endian == mpt::endian::little) {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			data[i] = static_cast<std::byte>(static_cast<uint8>((uval >> (i * 8)) & 0xffu));
+		}
+	} else {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			data[(sizeof(base_type) - 1) - i] = static_cast<std::byte>(static_cast<uint8>((uval >> (i * 8)) & 0xffu));
+		}
+	}
+	return data;
+}
+
+template <typename T, typename Tendian, std::size_t size>
+MPT_CONSTEXPRINLINE T EndianDecode(std::array<std::byte, size> data) noexcept {
+	static_assert(Tendian::endian == mpt::endian::little || Tendian::endian == mpt::endian::big);
+	static_assert(std::numeric_limits<T>::is_integer);
+	static_assert(!std::numeric_limits<T>::is_signed);
+	static_assert(sizeof(T) == size);
+	using base_type = T;
+	using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+	using endian_type = Tendian;
+	base_type val = base_type();
+	unsigned_base_type uval = unsigned_base_type();
+	if constexpr (endian_type::endian == mpt::endian::little) {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			uval |= static_cast<unsigned_base_type>(static_cast<uint8>(data[i])) << (i * 8);
+		}
+	} else {
+		for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+			uval |= static_cast<unsigned_base_type>(static_cast<uint8>(data[(sizeof(base_type) - 1) - i])) << (i * 8);
+		}
+	}
+	val = static_cast<base_type>(uval);
+	return val;
+}
+
+
+MPT_CONSTEXPR20_FUN uint64 SwapBytesImpl(uint64 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap64(value);
+	}
+	else {
+		return MPT_bswap64(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN uint32 SwapBytesImpl(uint32 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap32(value);
+	}
+	else {
+		return MPT_bswap32(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN uint16 SwapBytesImpl(uint16 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap16(value);
+	}
+	else {
+		return MPT_bswap16(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int64 SwapBytesImpl(int64 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap64(value);
+	}
+	else {
+		return MPT_bswap64(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int32 SwapBytesImpl(int32 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap32(value);
+	}
+	else {
+		return MPT_bswap32(value);
+	}
+}
+
+MPT_CONSTEXPR20_FUN int16 SwapBytesImpl(int16 value) noexcept {
+	MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+		return mpt::constexpr_bswap16(value);
+	}
+	else {
+		return MPT_bswap16(value);
+	}
+}
+
+// Do NOT remove these overloads, even if they seem useless.
+// We do not want risking to extend 8bit integers to int and then
+// endian-converting and casting back to int.
+// Thus these overloads.
+
+MPT_CONSTEXPR20_FUN uint8 SwapBytesImpl(uint8 value) noexcept {
+	return value;
+}
+
+MPT_CONSTEXPR20_FUN int8 SwapBytesImpl(int8 value) noexcept {
+	return value;
+}
+
+MPT_CONSTEXPR20_FUN char SwapBytesImpl(char value) noexcept {
+	return value;
+}
+
+#undef MPT_bswap16
+#undef MPT_bswap32
+#undef MPT_bswap64
+
+
+
+// On-disk integer types with defined endianness and no alignemnt requirements
+// Note: To easily debug module loaders (and anything else that uses this
+// wrapper struct), you can use the Debugger Visualizers available in
+// build/vs/debug/ to conveniently view the wrapped contents.
+
+template <typename T, typename Tendian>
+struct packed {
+public:
+	using base_type = T;
+	using endian_type = Tendian;
+
+public:
+	std::array<std::byte, sizeof(base_type)> data;
+
+public:
+	MPT_CONSTEXPR20_FUN void set(base_type val) noexcept {
+		static_assert(std::numeric_limits<T>::is_integer);
+		MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+			if constexpr (endian_type::endian == mpt::endian::big) {
+				typename std::make_unsigned<base_type>::type uval = val;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					data[i] = static_cast<std::byte>((uval >> (8 * (sizeof(base_type) - 1 - i))) & 0xffu);
+				}
+			} else {
+				typename std::make_unsigned<base_type>::type uval = val;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					data[i] = static_cast<std::byte>((uval >> (8 * i)) & 0xffu);
+				}
+			}
+		}
+		else {
+			if constexpr (mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big) {
+				if constexpr (mpt::endian::native != endian_type::endian) {
+					val = mpt::SwapBytesImpl(val);
+				}
+				std::memcpy(data.data(), &val, sizeof(val));
+			} else {
+				using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+				data = EndianEncode<unsigned_base_type, Tendian, sizeof(T)>(val);
+			}
+		}
+	}
+	MPT_CONSTEXPR20_FUN base_type get() const noexcept {
+		static_assert(std::numeric_limits<T>::is_integer);
+		MPT_MAYBE_CONSTANT_IF(MPT_IS_CONSTANT_EVALUATED20()) {
+			if constexpr (endian_type::endian == mpt::endian::big) {
+				typename std::make_unsigned<base_type>::type uval = 0;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					uval |= static_cast<typename std::make_unsigned<base_type>::type>(data[i]) << (8 * (sizeof(base_type) - 1 - i));
+				}
+				return static_cast<base_type>(uval);
+			} else {
+				typename std::make_unsigned<base_type>::type uval = 0;
+				for (std::size_t i = 0; i < sizeof(base_type); ++i) {
+					uval |= static_cast<typename std::make_unsigned<base_type>::type>(data[i]) << (8 * i);
+				}
+				return static_cast<base_type>(uval);
+			}
+		}
+		else {
+			if constexpr (mpt::endian::native == mpt::endian::little || mpt::endian::native == mpt::endian::big) {
+				base_type val = base_type();
+				std::memcpy(&val, data.data(), sizeof(val));
+				if constexpr (mpt::endian::native != endian_type::endian) {
+					val = mpt::SwapBytesImpl(val);
+				}
+				return val;
+			} else {
+				using unsigned_base_type = typename std::make_unsigned<base_type>::type;
+				return EndianDecode<unsigned_base_type, Tendian, sizeof(T)>(data);
+			}
+		}
+	}
+	MPT_CONSTEXPR20_FUN packed & operator=(const base_type & val) noexcept {
+		set(val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN operator base_type() const noexcept {
+		return get();
+	}
+
+public:
+	MPT_CONSTEXPR20_FUN packed & operator&=(base_type val) noexcept {
+		set(get() & val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator|=(base_type val) noexcept {
+		set(get() | val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator^=(base_type val) noexcept {
+		set(get() ^ val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator+=(base_type val) noexcept {
+		set(get() + val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator-=(base_type val) noexcept {
+		set(get() - val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator*=(base_type val) noexcept {
+		set(get() * val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator/=(base_type val) noexcept {
+		set(get() / val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator%=(base_type val) noexcept {
+		set(get() % val);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator++() noexcept { // prefix
+		set(get() + 1);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN packed & operator--() noexcept { // prefix
+		set(get() - 1);
+		return *this;
+	}
+	MPT_CONSTEXPR20_FUN base_type operator++(int) noexcept { // postfix
+		base_type old = get();
+		set(old + 1);
+		return old;
+	}
+	MPT_CONSTEXPR20_FUN base_type operator--(int) noexcept { // postfix
+		base_type old = get();
+		set(old - 1);
+		return old;
+	}
+};
+
+using int64le = packed<int64, LittleEndian_tag>;
+using int32le = packed<int32, LittleEndian_tag>;
+using int16le = packed<int16, LittleEndian_tag>;
+using int8le = packed<int8, LittleEndian_tag>;
+using uint64le = packed<uint64, LittleEndian_tag>;
+using uint32le = packed<uint32, LittleEndian_tag>;
+using uint16le = packed<uint16, LittleEndian_tag>;
+using uint8le = packed<uint8, LittleEndian_tag>;
+
+using int64be = packed<int64, BigEndian_tag>;
+using int32be = packed<int32, BigEndian_tag>;
+using int16be = packed<int16, BigEndian_tag>;
+using int8be = packed<int8, BigEndian_tag>;
+using uint64be = packed<uint64, BigEndian_tag>;
+using uint32be = packed<uint32, BigEndian_tag>;
+using uint16be = packed<uint16, BigEndian_tag>;
+using uint8be = packed<uint8, BigEndian_tag>;
+
+constexpr bool declare_binary_safe(const int64le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int32le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int16le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint64le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint32le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint16le &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8le &) {
+	return true;
+}
+
+constexpr bool declare_binary_safe(const int64be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int32be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int16be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const int8be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint64be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint32be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint16be &) {
+	return true;
+}
+constexpr bool declare_binary_safe(const uint8be &) {
+	return true;
+}
+
+static_assert(mpt::check_binary_size<int64le>(8));
+static_assert(mpt::check_binary_size<int32le>(4));
+static_assert(mpt::check_binary_size<int16le>(2));
+static_assert(mpt::check_binary_size<int8le>(1));
+static_assert(mpt::check_binary_size<uint64le>(8));
+static_assert(mpt::check_binary_size<uint32le>(4));
+static_assert(mpt::check_binary_size<uint16le>(2));
+static_assert(mpt::check_binary_size<uint8le>(1));
+
+static_assert(mpt::check_binary_size<int64be>(8));
+static_assert(mpt::check_binary_size<int32be>(4));
+static_assert(mpt::check_binary_size<int16be>(2));
+static_assert(mpt::check_binary_size<int8be>(1));
+static_assert(mpt::check_binary_size<uint64be>(8));
+static_assert(mpt::check_binary_size<uint32be>(4));
+static_assert(mpt::check_binary_size<uint16be>(2));
+static_assert(mpt::check_binary_size<uint8be>(1));
+
+
+
+template <typename T>
+struct make_le {
+	using type = packed<typename std::remove_const<T>::type, LittleEndian_tag>;
+};
+
+template <typename T>
+struct make_be {
+	using type = packed<typename std::remove_const<T>::type, BigEndian_tag>;
+};
+
+template <typename T>
+MPT_CONSTEXPR20_FUN auto as_le(T v) noexcept -> typename mpt::make_le<typename std::remove_const<T>::type>::type {
+	typename mpt::make_le<typename std::remove_const<T>::type>::type res{};
+	res = v;
+	return res;
+}
+
+template <typename T>
+MPT_CONSTEXPR20_FUN auto as_be(T v) noexcept -> typename mpt::make_be<typename std::remove_const<T>::type>::type {
+	typename mpt::make_be<typename std::remove_const<T>::type>::type res{};
+	res = v;
+	return res;
+}
+
+template <typename Tpacked>
+MPT_CONSTEXPR20_FUN Tpacked as_endian(typename Tpacked::base_type v) noexcept {
+	Tpacked res{};
+	res = v;
+	return res;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+namespace std {
+template <typename T, typename Tendian>
+class numeric_limits<mpt::packed<T, Tendian>> : public std::numeric_limits<T> { };
+template <typename T, typename Tendian>
+class numeric_limits<const mpt::packed<T, Tendian>> : public std::numeric_limits<const T> { };
+} // namespace std
+
+
+
+#endif // MPT_ENDIAN_INTEGER_HPP

Property changes on: src/mpt/endian/integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/tests/tests_endian_floatingpoint.hpp
===================================================================
--- src/mpt/endian/tests/tests_endian_floatingpoint.hpp	(nonexistent)
+++ src/mpt/endian/tests/tests_endian_floatingpoint.hpp	(working copy)
@@ -0,0 +1,66 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP
+#define MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/floatingpoint.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_endian_floatingpoint{
+	"mpt/endian/floatingpoint",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary32(1.0f), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary32(-1.0f), 0xbf800000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x00000000u), 0.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x41840000u), 16.5f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3faa0000u), 1.328125f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0xbfaa0000u), -1.328125f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3f800000u), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x00000000u), 0.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0xbf800000u), -1.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3f800000u), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(1.0f).GetInt32(), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(1.0f).GetInt32(), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x80), mpt::as_byte(0x3f)), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(mpt::as_byte(0x3f), mpt::as_byte(0x80), mpt::as_byte(0x00), mpt::as_byte(0x00)), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(1.0f), IEEE754binary32LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x80), mpt::as_byte(0x3f)));
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(1.0f), IEEE754binary32BE(mpt::as_byte(0x3f), mpt::as_byte(0x80), mpt::as_byte(0x00), mpt::as_byte(0x00)));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary64(1.0), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary64(-1.0), 0xbff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x4030800000000000ull), 16.5);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3FF5400000000000ull), 1.328125);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0xBFF5400000000000ull), -1.328125);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3ff0000000000000ull), 1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0xbff0000000000000ull), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3ff0000000000000ull), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(1.0).GetInt64(), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(1.0).GetInt64(), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0xf0), mpt::as_byte(0x3f)), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(mpt::as_byte(0x3f), mpt::as_byte(0xf0), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00)), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(1.0), IEEE754binary64LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0xf0), mpt::as_byte(0x3f)));
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(1.0), IEEE754binary64BE(mpt::as_byte(0x3f), mpt::as_byte(0xf0), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00)));
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP

Property changes on: src/mpt/endian/tests/tests_endian_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/tests/tests_endian_integer.hpp
===================================================================
--- src/mpt/endian/tests/tests_endian_integer.hpp	(nonexistent)
+++ src/mpt/endian/tests/tests_endian_integer.hpp	(working copy)
@@ -0,0 +1,118 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP
+#define MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_endian_integer{
+	"mpt/endian/integer",
+	[](mpt::test::context & context) {
+		static_assert(std::numeric_limits<int8le>::min() == std::numeric_limits<int8>::min());
+		static_assert(std::numeric_limits<uint8le>::min() == std::numeric_limits<uint8>::min());
+
+		static_assert(std::numeric_limits<int16le>::min() == std::numeric_limits<int16>::min());
+		static_assert(std::numeric_limits<uint16le>::min() == std::numeric_limits<uint16>::min());
+
+		static_assert(std::numeric_limits<int32le>::min() == std::numeric_limits<int32>::min());
+		static_assert(std::numeric_limits<uint32le>::min() == std::numeric_limits<uint32>::min());
+
+		static_assert(std::numeric_limits<int64le>::min() == std::numeric_limits<int64>::min());
+		static_assert(std::numeric_limits<uint64le>::min() == std::numeric_limits<uint64>::min());
+
+		static_assert(std::numeric_limits<int8le>::max() == std::numeric_limits<int8>::max());
+		static_assert(std::numeric_limits<uint8le>::max() == std::numeric_limits<uint8>::max());
+
+		static_assert(std::numeric_limits<int16le>::max() == std::numeric_limits<int16>::max());
+		static_assert(std::numeric_limits<uint16le>::max() == std::numeric_limits<uint16>::max());
+
+		static_assert(std::numeric_limits<int32le>::max() == std::numeric_limits<int32>::max());
+		static_assert(std::numeric_limits<uint32le>::max() == std::numeric_limits<uint32>::max());
+
+		static_assert(std::numeric_limits<int64le>::max() == std::numeric_limits<int64>::max());
+		static_assert(std::numeric_limits<uint64le>::max() == std::numeric_limits<uint64>::max());
+
+		struct test_endian_constexpr {
+			static MPT_CONSTEXPR20_FUN int32le test(uint32 x) {
+				int32le foo{};
+				foo = x;
+				return foo;
+			}
+		};
+
+		MPT_CONSTEXPR20_VAR int32le foo = test_endian_constexpr::test(23);
+		static_cast<void>(foo);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint8(0x12)), 0x12);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint16(0x1234)), 0x3412);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint32(0x12345678u)), 0x78563412u);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint64(0x123456789abcdef0ull)), 0xf0debc9a78563412ull);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int8(std::numeric_limits<int8>::min())), std::numeric_limits<int8>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int16(std::numeric_limits<int16>::min())), int16(0x80));
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int32(std::numeric_limits<int32>::min())), int32(0x80));
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int64(std::numeric_limits<int64>::min())), int64(0x80));
+
+		// Packed integers with defined endianness
+		{
+			int8le le8;
+			le8.set(-128);
+			int8be be8;
+			be8.set(-128);
+			MPT_TEST_EXPECT_EQUAL(le8, -128);
+			MPT_TEST_EXPECT_EQUAL(be8, -128);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le8, "\x80", 1), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be8, "\x80", 1), 0);
+			int16le le16;
+			le16.set(0x1234);
+			int16be be16;
+			be16.set(0x1234);
+			MPT_TEST_EXPECT_EQUAL(le16, 0x1234);
+			MPT_TEST_EXPECT_EQUAL(be16, 0x1234);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le16, "\x34\x12", 2), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be16, "\x12\x34", 2), 0);
+			uint32le le32;
+			le32.set(0xFFEEDDCCu);
+			uint32be be32;
+			be32.set(0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(le32, 0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(be32, 0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le32, "\xCC\xDD\xEE\xFF", 4), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be32, "\xFF\xEE\xDD\xCC", 4), 0);
+			uint64le le64;
+			le64.set(0xDEADC0DE15C0FFEEull);
+			uint64be be64;
+			be64.set(0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(le64, 0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(be64, 0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le64, "\xEE\xFF\xC0\x15\xDE\xC0\xAD\xDE", 8), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be64, "\xDE\xAD\xC0\xDE\x15\xC0\xFF\xEE", 8), 0);
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP

Property changes on: src/mpt/endian/tests/tests_endian_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/tests/tests_endian_floatingpoint.hpp
===================================================================
--- src/mpt/endian/tests/tests_endian_floatingpoint.hpp	(nonexistent)
+++ src/mpt/endian/tests/tests_endian_floatingpoint.hpp	(working copy)
@@ -0,0 +1,66 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP
+#define MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/floatingpoint.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_endian_floatingpoint{
+	"mpt/endian/floatingpoint",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary32(1.0f), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary32(-1.0f), 0xbf800000u);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x00000000u), 0.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x41840000u), 16.5f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3faa0000u), 1.328125f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0xbfaa0000u), -1.328125f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3f800000u), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x00000000u), 0.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0xbf800000u), -1.0f);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary32(0x3f800000u), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(1.0f).GetInt32(), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(1.0f).GetInt32(), 0x3f800000u);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x80), mpt::as_byte(0x3f)), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(mpt::as_byte(0x3f), mpt::as_byte(0x80), mpt::as_byte(0x00), mpt::as_byte(0x00)), 1.0f);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32LE(1.0f), IEEE754binary32LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x80), mpt::as_byte(0x3f)));
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary32BE(1.0f), IEEE754binary32BE(mpt::as_byte(0x3f), mpt::as_byte(0x80), mpt::as_byte(0x00), mpt::as_byte(0x00)));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary64(1.0), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(mpt::EncodeIEEE754binary64(-1.0), 0xbff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x4030800000000000ull), 16.5);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3FF5400000000000ull), 1.328125);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0xBFF5400000000000ull), -1.328125);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3ff0000000000000ull), 1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0xbff0000000000000ull), -1.0);
+		MPT_TEST_EXPECT_EQUAL(mpt::DecodeIEEE754binary64(0x3ff0000000000000ull), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(1.0).GetInt64(), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(1.0).GetInt64(), 0x3ff0000000000000ull);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0xf0), mpt::as_byte(0x3f)), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(mpt::as_byte(0x3f), mpt::as_byte(0xf0), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00)), 1.0);
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64LE(1.0), IEEE754binary64LE(mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0xf0), mpt::as_byte(0x3f)));
+		MPT_TEST_EXPECT_EQUAL(IEEE754binary64BE(1.0), IEEE754binary64BE(mpt::as_byte(0x3f), mpt::as_byte(0xf0), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00), mpt::as_byte(0x00)));
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_TESTS_ENDIAN_FLOATINGPOINT_HPP

Property changes on: src/mpt/endian/tests/tests_endian_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/endian/tests/tests_endian_integer.hpp
===================================================================
--- src/mpt/endian/tests/tests_endian_integer.hpp	(nonexistent)
+++ src/mpt/endian/tests/tests_endian_integer.hpp	(working copy)
@@ -0,0 +1,118 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP
+#define MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP
+
+
+
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_endian_integer{
+	"mpt/endian/integer",
+	[](mpt::test::context & context) {
+		static_assert(std::numeric_limits<int8le>::min() == std::numeric_limits<int8>::min());
+		static_assert(std::numeric_limits<uint8le>::min() == std::numeric_limits<uint8>::min());
+
+		static_assert(std::numeric_limits<int16le>::min() == std::numeric_limits<int16>::min());
+		static_assert(std::numeric_limits<uint16le>::min() == std::numeric_limits<uint16>::min());
+
+		static_assert(std::numeric_limits<int32le>::min() == std::numeric_limits<int32>::min());
+		static_assert(std::numeric_limits<uint32le>::min() == std::numeric_limits<uint32>::min());
+
+		static_assert(std::numeric_limits<int64le>::min() == std::numeric_limits<int64>::min());
+		static_assert(std::numeric_limits<uint64le>::min() == std::numeric_limits<uint64>::min());
+
+		static_assert(std::numeric_limits<int8le>::max() == std::numeric_limits<int8>::max());
+		static_assert(std::numeric_limits<uint8le>::max() == std::numeric_limits<uint8>::max());
+
+		static_assert(std::numeric_limits<int16le>::max() == std::numeric_limits<int16>::max());
+		static_assert(std::numeric_limits<uint16le>::max() == std::numeric_limits<uint16>::max());
+
+		static_assert(std::numeric_limits<int32le>::max() == std::numeric_limits<int32>::max());
+		static_assert(std::numeric_limits<uint32le>::max() == std::numeric_limits<uint32>::max());
+
+		static_assert(std::numeric_limits<int64le>::max() == std::numeric_limits<int64>::max());
+		static_assert(std::numeric_limits<uint64le>::max() == std::numeric_limits<uint64>::max());
+
+		struct test_endian_constexpr {
+			static MPT_CONSTEXPR20_FUN int32le test(uint32 x) {
+				int32le foo{};
+				foo = x;
+				return foo;
+			}
+		};
+
+		MPT_CONSTEXPR20_VAR int32le foo = test_endian_constexpr::test(23);
+		static_cast<void>(foo);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint8(0x12)), 0x12);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint16(0x1234)), 0x3412);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint32(0x12345678u)), 0x78563412u);
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(uint64(0x123456789abcdef0ull)), 0xf0debc9a78563412ull);
+
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int8(std::numeric_limits<int8>::min())), std::numeric_limits<int8>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int16(std::numeric_limits<int16>::min())), int16(0x80));
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int32(std::numeric_limits<int32>::min())), int32(0x80));
+		MPT_TEST_EXPECT_EQUAL(mpt::SwapBytesImpl(int64(std::numeric_limits<int64>::min())), int64(0x80));
+
+		// Packed integers with defined endianness
+		{
+			int8le le8;
+			le8.set(-128);
+			int8be be8;
+			be8.set(-128);
+			MPT_TEST_EXPECT_EQUAL(le8, -128);
+			MPT_TEST_EXPECT_EQUAL(be8, -128);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le8, "\x80", 1), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be8, "\x80", 1), 0);
+			int16le le16;
+			le16.set(0x1234);
+			int16be be16;
+			be16.set(0x1234);
+			MPT_TEST_EXPECT_EQUAL(le16, 0x1234);
+			MPT_TEST_EXPECT_EQUAL(be16, 0x1234);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le16, "\x34\x12", 2), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be16, "\x12\x34", 2), 0);
+			uint32le le32;
+			le32.set(0xFFEEDDCCu);
+			uint32be be32;
+			be32.set(0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(le32, 0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(be32, 0xFFEEDDCCu);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le32, "\xCC\xDD\xEE\xFF", 4), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be32, "\xFF\xEE\xDD\xCC", 4), 0);
+			uint64le le64;
+			le64.set(0xDEADC0DE15C0FFEEull);
+			uint64be be64;
+			be64.set(0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(le64, 0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(be64, 0xDEADC0DE15C0FFEEull);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&le64, "\xEE\xFF\xC0\x15\xDE\xC0\xAD\xDE", 8), 0);
+			MPT_TEST_EXPECT_EQUAL(std::memcmp(&be64, "\xDE\xAD\xC0\xDE\x15\xC0\xFF\xEE", 8), 0);
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENDIAN_TESTS_ENDIAN_INTEGER_HPP

Property changes on: src/mpt/endian/tests/tests_endian_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/environment/environment.hpp
===================================================================
--- src/mpt/environment/environment.hpp	(nonexistent)
+++ src/mpt/environment/environment.hpp	(working copy)
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENVIRONMENT_ENVIRONMENT_HPP
+#define MPT_ENVIRONMENT_ENVIRONMENT_HPP
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/system_error/system_error.hpp"
+
+#include <optional>
+#if MPT_OS_WINDOWS
+#if defined(UNICODE) && !MPT_OS_WINDOWS_WINRT
+#include <vector>
+#endif // !MPT_OS_WINDOWS_WINRT
+#endif // MPT_OS_WINDOWS
+
+#include <cstdlib>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline std::optional<mpt::ustring> getenv(const mpt::ustring & env_var) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+	MPT_UNUSED(env_var);
+	return std::nullopt;
+#elif MPT_OS_WINDOWS && defined(UNICODE)
+	std::vector<WCHAR> buf(32767);
+	DWORD size = GetEnvironmentVariable(mpt::convert<std::wstring>(env_var).c_str(), buf.data(), 32767);
+	if (size == 0) {
+		mpt::windows::ExpectError(ERROR_ENVVAR_NOT_FOUND);
+		return std::nullopt;
+	}
+	return mpt::convert<mpt::ustring>(buf.data());
+#else
+	const char * val = std::getenv(mpt::convert<std::string>(mpt::environment_encoding, env_var).c_str());
+	if (!val) {
+		return std::nullopt;
+	}
+	return mpt::convert<mpt::ustring>(mpt::environment_encoding, val);
+#endif
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENVIRONMENT_ENVIRONMENT_HPP

Property changes on: src/mpt/environment/environment.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/environment/environment.hpp
===================================================================
--- src/mpt/environment/environment.hpp	(nonexistent)
+++ src/mpt/environment/environment.hpp	(working copy)
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_ENVIRONMENT_ENVIRONMENT_HPP
+#define MPT_ENVIRONMENT_ENVIRONMENT_HPP
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/system_error/system_error.hpp"
+
+#include <optional>
+#if MPT_OS_WINDOWS
+#if defined(UNICODE) && !MPT_OS_WINDOWS_WINRT
+#include <vector>
+#endif // !MPT_OS_WINDOWS_WINRT
+#endif // MPT_OS_WINDOWS
+
+#include <cstdlib>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline std::optional<mpt::ustring> getenv(const mpt::ustring & env_var) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+	MPT_UNUSED(env_var);
+	return std::nullopt;
+#elif MPT_OS_WINDOWS && defined(UNICODE)
+	std::vector<WCHAR> buf(32767);
+	DWORD size = GetEnvironmentVariable(mpt::convert<std::wstring>(env_var).c_str(), buf.data(), 32767);
+	if (size == 0) {
+		mpt::windows::ExpectError(ERROR_ENVVAR_NOT_FOUND);
+		return std::nullopt;
+	}
+	return mpt::convert<mpt::ustring>(buf.data());
+#else
+	const char * val = std::getenv(mpt::convert<std::string>(mpt::environment_encoding, env_var).c_str());
+	if (!val) {
+		return std::nullopt;
+	}
+	return mpt::convert<mpt::ustring>(mpt::environment_encoding, val);
+#endif
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_ENVIRONMENT_ENVIRONMENT_HPP

Property changes on: src/mpt/environment/environment.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/exception_text/exception_text.hpp
===================================================================
--- src/mpt/exception_text/exception_text.hpp	(nonexistent)
+++ src/mpt/exception_text/exception_text.hpp	(working copy)
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP
+#define MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <exception>
+
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename Tstring>
+inline Tstring get_exception_text(const std::exception & e) {
+	if (e.what() && (std::strlen(e.what()) > 0)) {
+		return mpt::convert<Tstring>(mpt::exception_string{e.what()});
+	} else if (typeid(e).name() && (std::strlen(typeid(e).name()) > 0)) {
+		return mpt::convert<Tstring>(mpt::source_string{typeid(e).name()});
+	} else {
+		return mpt::convert<Tstring>(mpt::source_string{"unknown exception name"});
+	}
+}
+
+template <>
+inline std::string get_exception_text<std::string>(const std::exception & e) {
+	if (e.what() && (std::strlen(e.what()) > 0)) {
+		return std::string{e.what()};
+	} else if (typeid(e).name() && (std::strlen(typeid(e).name()) > 0)) {
+		return std::string{typeid(e).name()};
+	} else {
+		return std::string{"unknown exception name"};
+	}
+}
+
+
+template <typename Tstring>
+inline Tstring get_current_exception_text() {
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		return mpt::get_exception_text<Tstring>(e);
+	} catch (...) {
+		return mpt::convert<Tstring>(mpt::source_string{"unknown exception"});
+	}
+}
+
+template <>
+inline std::string get_current_exception_text<std::string>() {
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		return mpt::get_exception_text<std::string>(e);
+	} catch (...) {
+		return std::string{"unknown exception"};
+	}
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP

Property changes on: src/mpt/exception_text/exception_text.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/exception_text/exception_text.hpp
===================================================================
--- src/mpt/exception_text/exception_text.hpp	(nonexistent)
+++ src/mpt/exception_text/exception_text.hpp	(working copy)
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP
+#define MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <exception>
+
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename Tstring>
+inline Tstring get_exception_text(const std::exception & e) {
+	if (e.what() && (std::strlen(e.what()) > 0)) {
+		return mpt::convert<Tstring>(mpt::exception_string{e.what()});
+	} else if (typeid(e).name() && (std::strlen(typeid(e).name()) > 0)) {
+		return mpt::convert<Tstring>(mpt::source_string{typeid(e).name()});
+	} else {
+		return mpt::convert<Tstring>(mpt::source_string{"unknown exception name"});
+	}
+}
+
+template <>
+inline std::string get_exception_text<std::string>(const std::exception & e) {
+	if (e.what() && (std::strlen(e.what()) > 0)) {
+		return std::string{e.what()};
+	} else if (typeid(e).name() && (std::strlen(typeid(e).name()) > 0)) {
+		return std::string{typeid(e).name()};
+	} else {
+		return std::string{"unknown exception name"};
+	}
+}
+
+
+template <typename Tstring>
+inline Tstring get_current_exception_text() {
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		return mpt::get_exception_text<Tstring>(e);
+	} catch (...) {
+		return mpt::convert<Tstring>(mpt::source_string{"unknown exception"});
+	}
+}
+
+template <>
+inline std::string get_current_exception_text<std::string>() {
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		return mpt::get_exception_text<std::string>(e);
+	} catch (...) {
+		return std::string{"unknown exception"};
+	}
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_EXCEPTION_TEXT_EXCEPTION_TEXT_HPP

Property changes on: src/mpt/exception_text/exception_text.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/json/json.hpp
===================================================================
--- src/mpt/json/json.hpp	(nonexistent)
+++ src/mpt/json/json.hpp	(working copy)
@@ -0,0 +1,80 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_JSON_JSON_HPP
+#define MPT_JSON_JSON_HPP
+
+#include "mpt/base/detect.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#include <optional>
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmismatched-tags"
+#endif // MPT_COMPILER_CLANG
+#include "nlohmann/json.hpp"
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic pop
+#endif // MPT_COMPILER_CLANG
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+
+
+namespace nlohmann {
+template <>
+struct adl_serializer<mpt::ustring> {
+	static void to_json(json & j, const mpt::ustring & val) {
+		j = mpt::convert<std::string>(mpt::common_encoding::utf8, val);
+	}
+	static void from_json(const json & j, mpt::ustring & val) {
+		val = mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, j.get<std::string>());
+	}
+};
+template <typename Tvalue>
+struct adl_serializer<std::map<mpt::ustring, Tvalue>> {
+	static void to_json(json & j, const std::map<mpt::ustring, Tvalue> & val) {
+		std::map<std::string, Tvalue> utf8map;
+		for (const auto & value : val)
+		{
+			utf8map[mpt::convert<std::string>(mpt::common_encoding::utf8, value.first)] = value.second;
+		}
+		j = std::move(utf8map);
+	}
+	static void from_json(const json & j, std::map<mpt::ustring, Tvalue> & val) {
+		std::map<std::string, Tvalue> utf8map = j.get<std::map<std::string, Tvalue>>();
+		std::map<mpt::ustring, Tvalue> result;
+		for (const auto & value : utf8map)
+		{
+			result[mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, value.first)] = value.second;
+		}
+		val = std::move(result);
+	}
+};
+template <typename Tvalue>
+struct adl_serializer<std::optional<Tvalue>> {
+	static void to_json(json & j, const std::optional<Tvalue> & val) {
+		j = (val ? json{*val} : json{nullptr});
+	}
+	static void from_json(const json & j, std::optional<Tvalue> & val) {
+		if (!j.is_null())
+		{
+			val = j.get<Tvalue>();
+		} else
+		{
+			val = std::nullopt;
+		}
+	}
+};
+} // namespace nlohmann
+
+
+
+#endif // MPT_JSON_JSON_HPP

Property changes on: src/mpt/json/json.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/json/json.hpp
===================================================================
--- src/mpt/json/json.hpp	(nonexistent)
+++ src/mpt/json/json.hpp	(working copy)
@@ -0,0 +1,80 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_JSON_JSON_HPP
+#define MPT_JSON_JSON_HPP
+
+#include "mpt/base/detect.hpp"
+#include "mpt/detect/nlohmann_json.hpp"
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#include <optional>
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+#if MPT_DETECTED_NLOHMANN_JSON
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmismatched-tags"
+#endif // MPT_COMPILER_CLANG
+#include "nlohmann/json.hpp"
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic pop
+#endif // MPT_COMPILER_CLANG
+#endif // MPT_DETECTED_NLOHMANN_JSON
+
+
+
+namespace nlohmann {
+template <>
+struct adl_serializer<mpt::ustring> {
+	static void to_json(json & j, const mpt::ustring & val) {
+		j = mpt::convert<std::string>(mpt::common_encoding::utf8, val);
+	}
+	static void from_json(const json & j, mpt::ustring & val) {
+		val = mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, j.get<std::string>());
+	}
+};
+template <typename Tvalue>
+struct adl_serializer<std::map<mpt::ustring, Tvalue>> {
+	static void to_json(json & j, const std::map<mpt::ustring, Tvalue> & val) {
+		std::map<std::string, Tvalue> utf8map;
+		for (const auto & value : val)
+		{
+			utf8map[mpt::convert<std::string>(mpt::common_encoding::utf8, value.first)] = value.second;
+		}
+		j = std::move(utf8map);
+	}
+	static void from_json(const json & j, std::map<mpt::ustring, Tvalue> & val) {
+		std::map<std::string, Tvalue> utf8map = j.get<std::map<std::string, Tvalue>>();
+		std::map<mpt::ustring, Tvalue> result;
+		for (const auto & value : utf8map)
+		{
+			result[mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, value.first)] = value.second;
+		}
+		val = std::move(result);
+	}
+};
+template <typename Tvalue>
+struct adl_serializer<std::optional<Tvalue>> {
+	static void to_json(json & j, const std::optional<Tvalue> & val) {
+		j = (val ? json{*val} : json{nullptr});
+	}
+	static void from_json(const json & j, std::optional<Tvalue> & val) {
+		if (!j.is_null())
+		{
+			val = j.get<Tvalue>();
+		} else
+		{
+			val = std::nullopt;
+		}
+	}
+};
+} // namespace nlohmann
+
+
+
+#endif // MPT_JSON_JSON_HPP

Property changes on: src/mpt/json/json.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/LICENSE.BSD-3-Clause.txt
===================================================================
--- src/mpt/LICENSE.BSD-3-Clause.txt	(nonexistent)
+++ src/mpt/LICENSE.BSD-3-Clause.txt	(working copy)
@@ -0,0 +1,25 @@
+Copyright (c) 2004-2021, OpenMPT Project Developers and Contributors
+Copyright (c) 1997-2003, Olivier Lapicque
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the OpenMPT project nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.

Property changes on: src/mpt/LICENSE.BSD-3-Clause.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: src/mpt/LICENSE.BSL-1.0.txt
===================================================================
--- src/mpt/LICENSE.BSL-1.0.txt	(nonexistent)
+++ src/mpt/LICENSE.BSL-1.0.txt	(working copy)
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.

Property changes on: src/mpt/LICENSE.BSL-1.0.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Index: src/mpt/mutex/mutex.hpp
===================================================================
--- src/mpt/mutex/mutex.hpp	(nonexistent)
+++ src/mpt/mutex/mutex.hpp	(working copy)
@@ -0,0 +1,178 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_MUTEX_MUTEX_HPP
+#define MPT_MUTEX_MUTEX_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+
+#if !MPT_PLATFORM_MULTITHREADED
+#define MPT_MUTEX_NONE 1
+#elif MPT_COMPILER_GENERIC
+#define MPT_MUTEX_STD 1
+#elif MPT_OS_WINDOWS && MPT_LIBCXX_GNU && !defined(_GLIBCXX_HAS_GTHREADS) && defined(MPT_WITH_MINGWSTDTHREADS)
+#define MPT_MUTEX_STD 1
+#elif MPT_OS_WINDOWS && MPT_LIBCXX_GNU && !defined(_GLIBCXX_HAS_GTHREADS)
+#define MPT_MUTEX_WIN32 1
+#else
+#define MPT_MUTEX_STD 1
+#endif
+
+#ifndef MPT_MUTEX_STD
+#define MPT_MUTEX_STD 0
+#endif
+#ifndef MPT_MUTEX_WIN32
+#define MPT_MUTEX_WIN32 0
+#endif
+#ifndef MPT_MUTEX_NONE
+#define MPT_MUTEX_NONE 0
+#endif
+
+#if MPT_MUTEX_STD
+#if !MPT_COMPILER_GENERIC && (defined(__MINGW32__) || defined(__MINGW64__)) && !defined(_GLIBCXX_HAS_GTHREADS) && defined(MPT_WITH_MINGWSTDTHREADS)
+#include <mingw.mutex.h>
+#else
+#include <mutex>
+#endif
+#elif MPT_MUTEX_WIN32
+#include <windows.h>
+#endif // MPT_MUTEX
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_MUTEX_STD
+
+using mutex = std::mutex;
+using recursive_mutex = std::recursive_mutex;
+
+#elif MPT_MUTEX_WIN32
+
+// compatible with c++11 std::mutex, can eventually be replaced without touching any usage site
+class mutex {
+private:
+	CRITICAL_SECTION impl;
+
+public:
+	mutex() {
+		InitializeCriticalSection(&impl);
+	}
+	~mutex() {
+		DeleteCriticalSection(&impl);
+	}
+	void lock() {
+		EnterCriticalSection(&impl);
+	}
+	bool try_lock() {
+		return TryEnterCriticalSection(&impl) ? true : false;
+	}
+	void unlock() {
+		LeaveCriticalSection(&impl);
+	}
+};
+
+// compatible with c++11 std::recursive_mutex, can eventually be replaced without touching any usage site
+class recursive_mutex {
+private:
+	CRITICAL_SECTION impl;
+
+public:
+	recursive_mutex() {
+		InitializeCriticalSection(&impl);
+	}
+	~recursive_mutex() {
+		DeleteCriticalSection(&impl);
+	}
+	void lock() {
+		EnterCriticalSection(&impl);
+	}
+	bool try_lock() {
+		return TryEnterCriticalSection(&impl) ? true : false;
+	}
+	void unlock() {
+		LeaveCriticalSection(&impl);
+	}
+};
+
+#else // MPT_MUTEX_NONE
+
+class mutex {
+public:
+	mutex() {
+		return;
+	}
+	~mutex() {
+		return;
+	}
+	void lock() {
+		return;
+	}
+	bool try_lock() {
+		return true;
+	}
+	void unlock() {
+		return;
+	}
+};
+
+class recursive_mutex {
+public:
+	recursive_mutex() {
+		return;
+	}
+	~recursive_mutex() {
+		return;
+	}
+	void lock() {
+		return;
+	}
+	bool try_lock() {
+		return true;
+	}
+	void unlock() {
+		return;
+	}
+};
+
+#endif // MPT_MUTEX
+
+#if MPT_MUTEX_STD
+
+template <typename T>
+using lock_guard = std::lock_guard<T>;
+
+#else // !MPT_MUTEX_STD
+
+// compatible with c++11 std::lock_guard, can eventually be replaced without touching any usage site
+template <typename mutex_type>
+class lock_guard {
+private:
+	mutex_type & mutex;
+
+public:
+	lock_guard(mutex_type & m)
+		: mutex(m) {
+		mutex.lock();
+	}
+	~lock_guard() {
+		mutex.unlock();
+	}
+};
+
+#endif // MPT_MUTEX_STD
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_MUTEX_MUTEX_HPP

Property changes on: src/mpt/mutex/mutex.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/mutex/mutex.hpp
===================================================================
--- src/mpt/mutex/mutex.hpp	(nonexistent)
+++ src/mpt/mutex/mutex.hpp	(working copy)
@@ -0,0 +1,178 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_MUTEX_MUTEX_HPP
+#define MPT_MUTEX_MUTEX_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+
+
+#if !MPT_PLATFORM_MULTITHREADED
+#define MPT_MUTEX_NONE 1
+#elif MPT_COMPILER_GENERIC
+#define MPT_MUTEX_STD 1
+#elif MPT_OS_WINDOWS && MPT_LIBCXX_GNU && !defined(_GLIBCXX_HAS_GTHREADS) && defined(MPT_WITH_MINGWSTDTHREADS)
+#define MPT_MUTEX_STD 1
+#elif MPT_OS_WINDOWS && MPT_LIBCXX_GNU && !defined(_GLIBCXX_HAS_GTHREADS)
+#define MPT_MUTEX_WIN32 1
+#else
+#define MPT_MUTEX_STD 1
+#endif
+
+#ifndef MPT_MUTEX_STD
+#define MPT_MUTEX_STD 0
+#endif
+#ifndef MPT_MUTEX_WIN32
+#define MPT_MUTEX_WIN32 0
+#endif
+#ifndef MPT_MUTEX_NONE
+#define MPT_MUTEX_NONE 0
+#endif
+
+#if MPT_MUTEX_STD
+#if !MPT_COMPILER_GENERIC && (defined(__MINGW32__) || defined(__MINGW64__)) && !defined(_GLIBCXX_HAS_GTHREADS) && defined(MPT_WITH_MINGWSTDTHREADS)
+#include <mingw.mutex.h>
+#else
+#include <mutex>
+#endif
+#elif MPT_MUTEX_WIN32
+#include <windows.h>
+#endif // MPT_MUTEX
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_MUTEX_STD
+
+using mutex = std::mutex;
+using recursive_mutex = std::recursive_mutex;
+
+#elif MPT_MUTEX_WIN32
+
+// compatible with c++11 std::mutex, can eventually be replaced without touching any usage site
+class mutex {
+private:
+	CRITICAL_SECTION impl;
+
+public:
+	mutex() {
+		InitializeCriticalSection(&impl);
+	}
+	~mutex() {
+		DeleteCriticalSection(&impl);
+	}
+	void lock() {
+		EnterCriticalSection(&impl);
+	}
+	bool try_lock() {
+		return TryEnterCriticalSection(&impl) ? true : false;
+	}
+	void unlock() {
+		LeaveCriticalSection(&impl);
+	}
+};
+
+// compatible with c++11 std::recursive_mutex, can eventually be replaced without touching any usage site
+class recursive_mutex {
+private:
+	CRITICAL_SECTION impl;
+
+public:
+	recursive_mutex() {
+		InitializeCriticalSection(&impl);
+	}
+	~recursive_mutex() {
+		DeleteCriticalSection(&impl);
+	}
+	void lock() {
+		EnterCriticalSection(&impl);
+	}
+	bool try_lock() {
+		return TryEnterCriticalSection(&impl) ? true : false;
+	}
+	void unlock() {
+		LeaveCriticalSection(&impl);
+	}
+};
+
+#else // MPT_MUTEX_NONE
+
+class mutex {
+public:
+	mutex() {
+		return;
+	}
+	~mutex() {
+		return;
+	}
+	void lock() {
+		return;
+	}
+	bool try_lock() {
+		return true;
+	}
+	void unlock() {
+		return;
+	}
+};
+
+class recursive_mutex {
+public:
+	recursive_mutex() {
+		return;
+	}
+	~recursive_mutex() {
+		return;
+	}
+	void lock() {
+		return;
+	}
+	bool try_lock() {
+		return true;
+	}
+	void unlock() {
+		return;
+	}
+};
+
+#endif // MPT_MUTEX
+
+#if MPT_MUTEX_STD
+
+template <typename T>
+using lock_guard = std::lock_guard<T>;
+
+#else // !MPT_MUTEX_STD
+
+// compatible with c++11 std::lock_guard, can eventually be replaced without touching any usage site
+template <typename mutex_type>
+class lock_guard {
+private:
+	mutex_type & mutex;
+
+public:
+	lock_guard(mutex_type & m)
+		: mutex(m) {
+		mutex.lock();
+	}
+	~lock_guard() {
+		mutex.unlock();
+	}
+};
+
+#endif // MPT_MUTEX_STD
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_MUTEX_MUTEX_HPP

Property changes on: src/mpt/mutex/mutex.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/osinfo/windows_version.hpp
===================================================================
--- src/mpt/osinfo/windows_version.hpp	(nonexistent)
+++ src/mpt/osinfo/windows_version.hpp	(working copy)
@@ -0,0 +1,347 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_OSINFO_WINDOWS_VERSION_HPP
+#define MPT_OSINFO_WINDOWS_VERSION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace osinfo {
+
+namespace windows {
+
+
+
+class Version {
+
+public:
+	enum Number : uint64
+	{
+		WinNT4 = 0x0000000400000000ull,
+		Win2000 = 0x0000000500000000ull,
+		WinXP = 0x0000000500000001ull,
+		WinXP64 = 0x0000000500000002ull,
+		WinVista = 0x0000000600000000ull,
+		Win7 = 0x0000000600000001ull,
+		Win8 = 0x0000000600000002ull,
+		Win81 = 0x0000000600000003ull,
+		Win10 = 0x0000000a00000000ull,
+		WinNewer = Win10 + 1ull
+	};
+
+	struct System {
+		uint32 Major = 0;
+		uint32 Minor = 0;
+		System() = default;
+		constexpr System(Number number) noexcept
+			: Major(static_cast<uint32>((static_cast<uint64>(number) >> 32) & 0xffffffffu))
+			, Minor(static_cast<uint32>((static_cast<uint64>(number) >> 0) & 0xffffffffu)) {
+		}
+		explicit constexpr System(uint64 number) noexcept
+			: Major(static_cast<uint32>((number >> 32) & 0xffffffffu))
+			, Minor(static_cast<uint32>((number >> 0) & 0xffffffffu)) {
+		}
+		explicit constexpr System(uint32 major, uint32 minor) noexcept
+			: Major(major)
+			, Minor(minor) {
+		}
+		constexpr operator uint64() const noexcept {
+			return (static_cast<uint64>(Major) << 32) | (static_cast<uint64>(Minor) << 0);
+		}
+	};
+
+	struct ServicePack {
+		uint16 Major = 0;
+		uint16 Minor = 0;
+		ServicePack() = default;
+		explicit constexpr ServicePack(uint16 major, uint16 minor) noexcept
+			: Major(major)
+			, Minor(minor) {
+		}
+		constexpr bool HasServicePack() const noexcept {
+			return Major != 0 || Minor != 0;
+		}
+		constexpr operator uint32() const noexcept {
+			return (static_cast<uint32>(Major) << 16) | (static_cast<uint32>(Minor) << 0);
+		}
+	};
+
+	typedef uint32 Build;
+
+	typedef uint32 TypeId;
+
+protected:
+	bool m_SystemIsWindows;
+
+	System m_System;
+	ServicePack m_ServicePack;
+	Build m_Build;
+	TypeId m_Type;
+
+protected:
+	Version() noexcept
+		: m_SystemIsWindows(false)
+		, m_System()
+		, m_ServicePack()
+		, m_Build()
+		, m_Type() {
+	}
+
+public:
+	static Version NoWindows() noexcept {
+		return Version();
+	}
+
+	Version(mpt::osinfo::windows::Version::System system, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build, mpt::osinfo::windows::Version::TypeId type) noexcept
+		: m_SystemIsWindows(true)
+		, m_System(system)
+		, m_ServicePack(servicePack)
+		, m_Build(build)
+		, m_Type(type) {
+	}
+
+protected:
+#if MPT_OS_WINDOWS
+
+	static mpt::osinfo::windows::Version VersionFromNTDDI_VERSION() noexcept {
+		// Initialize to used SDK version
+		mpt::osinfo::windows::Version::System System =
+#if NTDDI_VERSION >= 0x0A000000 // NTDDI_WIN10
+			mpt::osinfo::windows::Version::Win10
+#elif NTDDI_VERSION >= 0x06030000 // NTDDI_WINBLUE
+			mpt::osinfo::windows::Version::Win81
+#elif NTDDI_VERSION >= 0x06020000 // NTDDI_WIN8
+			mpt::osinfo::windows::Version::Win8
+#elif NTDDI_VERSION >= 0x06010000 // NTDDI_WIN7
+			mpt::osinfo::windows::Version::Win7
+#elif NTDDI_VERSION >= 0x06000000 // NTDDI_VISTA
+			mpt::osinfo::windows::Version::WinVista
+#elif NTDDI_VERSION >= 0x05020000 // NTDDI_WS03
+			mpt::osinfo::windows::Version::WinXP64
+#elif NTDDI_VERSION >= NTDDI_WINXP
+			mpt::osinfo::windows::Version::WinXP
+#elif NTDDI_VERSION >= NTDDI_WIN2K
+			mpt::osinfo::windows::Version::Win2000
+#else
+			mpt::osinfo::windows::Version::WinNT4
+#endif
+			;
+		return mpt::osinfo::windows::Version(System, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
+	}
+
+	static mpt::osinfo::windows::Version::System SystemVersionFrom_WIN32_WINNT() noexcept {
+#if defined(_WIN32_WINNT)
+		return mpt::osinfo::windows::Version::System((static_cast<uint64>(_WIN32_WINNT) & 0xff00u) >> 8, (static_cast<uint64>(_WIN32_WINNT) & 0x00ffu) >> 0);
+#else
+		return mpt::osinfo::windows::Version::System();
+#endif
+	}
+
+	static mpt::osinfo::windows::Version GatherWindowsVersion() noexcept {
+#if MPT_OS_WINDOWS_WINRT
+		return VersionFromNTDDI_VERSION();
+#else // !MPT_OS_WINDOWS_WINRT
+		OSVERSIONINFOEXW versioninfoex{};
+		versioninfoex.dwOSVersionInfoSize = sizeof(versioninfoex);
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4996)  // 'GetVersionExW': was declared deprecated
+#pragma warning(disable : 28159) // Consider using 'IsWindows*' instead of 'GetVersionExW'. Reason: Deprecated. Use VerifyVersionInfo* or IsWindows* macros from VersionHelpers.
+#endif                           // MPT_COMPILER_MSVC
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif // MPT_COMPILER_CLANG
+		if (GetVersionExW((LPOSVERSIONINFOW)&versioninfoex) == FALSE) {
+			return VersionFromNTDDI_VERSION();
+		}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic pop
+#endif                       // MPT_COMPILER_CLANG
+		if (versioninfoex.dwPlatformId != VER_PLATFORM_WIN32_NT) {
+			return VersionFromNTDDI_VERSION();
+		}
+		DWORD dwProductType = 0;
+#if (_WIN32_WINNT >= 0x0600) // _WIN32_WINNT_VISTA
+		dwProductType = PRODUCT_UNDEFINED;
+		if (GetProductInfo(versioninfoex.dwMajorVersion, versioninfoex.dwMinorVersion, versioninfoex.wServicePackMajor, versioninfoex.wServicePackMinor, &dwProductType) == FALSE) {
+			dwProductType = PRODUCT_UNDEFINED;
+		}
+#endif
+		return mpt::osinfo::windows::Version(
+			mpt::osinfo::windows::Version::System(versioninfoex.dwMajorVersion, versioninfoex.dwMinorVersion),
+			mpt::osinfo::windows::Version::ServicePack(versioninfoex.wServicePackMajor, versioninfoex.wServicePackMinor),
+			versioninfoex.dwBuildNumber,
+			dwProductType);
+#endif // MPT_OS_WINDOWS_WINRT
+	}
+
+#endif // MPT_OS_WINDOWS
+
+public:
+	static mpt::osinfo::windows::Version Current() noexcept {
+#if MPT_OS_WINDOWS
+		return GatherWindowsVersion();
+#else  // !MPT_OS_WINDOWS
+		return mpt::osinfo::windows::Version::NoWindows();
+#endif // MPT_OS_WINDOWS
+	}
+
+public:
+	bool IsWindows() const noexcept {
+		return m_SystemIsWindows;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		return m_System < version;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		return m_ServicePack < servicePack;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		return m_Build < build;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		if (m_ServicePack > servicePack) {
+			return false;
+		}
+		if (m_ServicePack < servicePack) {
+			return true;
+		}
+		return m_Build < build;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		return m_System >= version;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		return m_ServicePack >= servicePack;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		return m_Build >= build;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		if (m_ServicePack < servicePack) {
+			return false;
+		}
+		if (m_ServicePack > servicePack) {
+			return true;
+		}
+		return m_Build >= build;
+	}
+
+	mpt::osinfo::windows::Version::System GetSystem() const noexcept {
+		return m_System;
+	}
+
+	mpt::osinfo::windows::Version::ServicePack GetServicePack() const noexcept {
+		return m_ServicePack;
+	}
+
+	mpt::osinfo::windows::Version::Build GetBuild() const noexcept {
+		return m_Build;
+	}
+
+	mpt::osinfo::windows::Version::TypeId GetTypeId() const noexcept {
+		return m_Type;
+	}
+
+}; // class Version
+
+
+
+} // namespace windows
+
+} // namespace osinfo
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_OSINFO_WINDOWS_VERSION_HPP

Property changes on: src/mpt/osinfo/windows_version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/osinfo/windows_version.hpp
===================================================================
--- src/mpt/osinfo/windows_version.hpp	(nonexistent)
+++ src/mpt/osinfo/windows_version.hpp	(working copy)
@@ -0,0 +1,347 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_OSINFO_WINDOWS_VERSION_HPP
+#define MPT_OSINFO_WINDOWS_VERSION_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+namespace osinfo {
+
+namespace windows {
+
+
+
+class Version {
+
+public:
+	enum Number : uint64
+	{
+		WinNT4 = 0x0000000400000000ull,
+		Win2000 = 0x0000000500000000ull,
+		WinXP = 0x0000000500000001ull,
+		WinXP64 = 0x0000000500000002ull,
+		WinVista = 0x0000000600000000ull,
+		Win7 = 0x0000000600000001ull,
+		Win8 = 0x0000000600000002ull,
+		Win81 = 0x0000000600000003ull,
+		Win10 = 0x0000000a00000000ull,
+		WinNewer = Win10 + 1ull
+	};
+
+	struct System {
+		uint32 Major = 0;
+		uint32 Minor = 0;
+		System() = default;
+		constexpr System(Number number) noexcept
+			: Major(static_cast<uint32>((static_cast<uint64>(number) >> 32) & 0xffffffffu))
+			, Minor(static_cast<uint32>((static_cast<uint64>(number) >> 0) & 0xffffffffu)) {
+		}
+		explicit constexpr System(uint64 number) noexcept
+			: Major(static_cast<uint32>((number >> 32) & 0xffffffffu))
+			, Minor(static_cast<uint32>((number >> 0) & 0xffffffffu)) {
+		}
+		explicit constexpr System(uint32 major, uint32 minor) noexcept
+			: Major(major)
+			, Minor(minor) {
+		}
+		constexpr operator uint64() const noexcept {
+			return (static_cast<uint64>(Major) << 32) | (static_cast<uint64>(Minor) << 0);
+		}
+	};
+
+	struct ServicePack {
+		uint16 Major = 0;
+		uint16 Minor = 0;
+		ServicePack() = default;
+		explicit constexpr ServicePack(uint16 major, uint16 minor) noexcept
+			: Major(major)
+			, Minor(minor) {
+		}
+		constexpr bool HasServicePack() const noexcept {
+			return Major != 0 || Minor != 0;
+		}
+		constexpr operator uint32() const noexcept {
+			return (static_cast<uint32>(Major) << 16) | (static_cast<uint32>(Minor) << 0);
+		}
+	};
+
+	typedef uint32 Build;
+
+	typedef uint32 TypeId;
+
+protected:
+	bool m_SystemIsWindows;
+
+	System m_System;
+	ServicePack m_ServicePack;
+	Build m_Build;
+	TypeId m_Type;
+
+protected:
+	Version() noexcept
+		: m_SystemIsWindows(false)
+		, m_System()
+		, m_ServicePack()
+		, m_Build()
+		, m_Type() {
+	}
+
+public:
+	static Version NoWindows() noexcept {
+		return Version();
+	}
+
+	Version(mpt::osinfo::windows::Version::System system, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build, mpt::osinfo::windows::Version::TypeId type) noexcept
+		: m_SystemIsWindows(true)
+		, m_System(system)
+		, m_ServicePack(servicePack)
+		, m_Build(build)
+		, m_Type(type) {
+	}
+
+protected:
+#if MPT_OS_WINDOWS
+
+	static mpt::osinfo::windows::Version VersionFromNTDDI_VERSION() noexcept {
+		// Initialize to used SDK version
+		mpt::osinfo::windows::Version::System System =
+#if NTDDI_VERSION >= 0x0A000000 // NTDDI_WIN10
+			mpt::osinfo::windows::Version::Win10
+#elif NTDDI_VERSION >= 0x06030000 // NTDDI_WINBLUE
+			mpt::osinfo::windows::Version::Win81
+#elif NTDDI_VERSION >= 0x06020000 // NTDDI_WIN8
+			mpt::osinfo::windows::Version::Win8
+#elif NTDDI_VERSION >= 0x06010000 // NTDDI_WIN7
+			mpt::osinfo::windows::Version::Win7
+#elif NTDDI_VERSION >= 0x06000000 // NTDDI_VISTA
+			mpt::osinfo::windows::Version::WinVista
+#elif NTDDI_VERSION >= 0x05020000 // NTDDI_WS03
+			mpt::osinfo::windows::Version::WinXP64
+#elif NTDDI_VERSION >= NTDDI_WINXP
+			mpt::osinfo::windows::Version::WinXP
+#elif NTDDI_VERSION >= NTDDI_WIN2K
+			mpt::osinfo::windows::Version::Win2000
+#else
+			mpt::osinfo::windows::Version::WinNT4
+#endif
+			;
+		return mpt::osinfo::windows::Version(System, mpt::osinfo::windows::Version::ServicePack(((NTDDI_VERSION & 0xffffu) >> 8) & 0xffu, ((NTDDI_VERSION & 0xffffu) >> 0) & 0xffu), 0, 0);
+	}
+
+	static mpt::osinfo::windows::Version::System SystemVersionFrom_WIN32_WINNT() noexcept {
+#if defined(_WIN32_WINNT)
+		return mpt::osinfo::windows::Version::System((static_cast<uint64>(_WIN32_WINNT) & 0xff00u) >> 8, (static_cast<uint64>(_WIN32_WINNT) & 0x00ffu) >> 0);
+#else
+		return mpt::osinfo::windows::Version::System();
+#endif
+	}
+
+	static mpt::osinfo::windows::Version GatherWindowsVersion() noexcept {
+#if MPT_OS_WINDOWS_WINRT
+		return VersionFromNTDDI_VERSION();
+#else // !MPT_OS_WINDOWS_WINRT
+		OSVERSIONINFOEXW versioninfoex{};
+		versioninfoex.dwOSVersionInfoSize = sizeof(versioninfoex);
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4996)  // 'GetVersionExW': was declared deprecated
+#pragma warning(disable : 28159) // Consider using 'IsWindows*' instead of 'GetVersionExW'. Reason: Deprecated. Use VerifyVersionInfo* or IsWindows* macros from VersionHelpers.
+#endif                           // MPT_COMPILER_MSVC
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#endif // MPT_COMPILER_CLANG
+		if (GetVersionExW((LPOSVERSIONINFOW)&versioninfoex) == FALSE) {
+			return VersionFromNTDDI_VERSION();
+		}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+#if MPT_COMPILER_CLANG
+#pragma clang diagnostic pop
+#endif                       // MPT_COMPILER_CLANG
+		if (versioninfoex.dwPlatformId != VER_PLATFORM_WIN32_NT) {
+			return VersionFromNTDDI_VERSION();
+		}
+		DWORD dwProductType = 0;
+#if (_WIN32_WINNT >= 0x0600) // _WIN32_WINNT_VISTA
+		dwProductType = PRODUCT_UNDEFINED;
+		if (GetProductInfo(versioninfoex.dwMajorVersion, versioninfoex.dwMinorVersion, versioninfoex.wServicePackMajor, versioninfoex.wServicePackMinor, &dwProductType) == FALSE) {
+			dwProductType = PRODUCT_UNDEFINED;
+		}
+#endif
+		return mpt::osinfo::windows::Version(
+			mpt::osinfo::windows::Version::System(versioninfoex.dwMajorVersion, versioninfoex.dwMinorVersion),
+			mpt::osinfo::windows::Version::ServicePack(versioninfoex.wServicePackMajor, versioninfoex.wServicePackMinor),
+			versioninfoex.dwBuildNumber,
+			dwProductType);
+#endif // MPT_OS_WINDOWS_WINRT
+	}
+
+#endif // MPT_OS_WINDOWS
+
+public:
+	static mpt::osinfo::windows::Version Current() noexcept {
+#if MPT_OS_WINDOWS
+		return GatherWindowsVersion();
+#else  // !MPT_OS_WINDOWS
+		return mpt::osinfo::windows::Version::NoWindows();
+#endif // MPT_OS_WINDOWS
+	}
+
+public:
+	bool IsWindows() const noexcept {
+		return m_SystemIsWindows;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		return m_System < version;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		return m_ServicePack < servicePack;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		return m_Build < build;
+	}
+
+	bool IsBefore(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System > version) {
+			return false;
+		}
+		if (m_System < version) {
+			return true;
+		}
+		if (m_ServicePack > servicePack) {
+			return false;
+		}
+		if (m_ServicePack < servicePack) {
+			return true;
+		}
+		return m_Build < build;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		return m_System >= version;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		return m_ServicePack >= servicePack;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		return m_Build >= build;
+	}
+
+	bool IsAtLeast(mpt::osinfo::windows::Version::System version, mpt::osinfo::windows::Version::ServicePack servicePack, mpt::osinfo::windows::Version::Build build) const noexcept {
+		if (!m_SystemIsWindows) {
+			return false;
+		}
+		if (m_System < version) {
+			return false;
+		}
+		if (m_System > version) {
+			return true;
+		}
+		if (m_ServicePack < servicePack) {
+			return false;
+		}
+		if (m_ServicePack > servicePack) {
+			return true;
+		}
+		return m_Build >= build;
+	}
+
+	mpt::osinfo::windows::Version::System GetSystem() const noexcept {
+		return m_System;
+	}
+
+	mpt::osinfo::windows::Version::ServicePack GetServicePack() const noexcept {
+		return m_ServicePack;
+	}
+
+	mpt::osinfo::windows::Version::Build GetBuild() const noexcept {
+		return m_Build;
+	}
+
+	mpt::osinfo::windows::Version::TypeId GetTypeId() const noexcept {
+		return m_Type;
+	}
+
+}; // class Version
+
+
+
+} // namespace windows
+
+} // namespace osinfo
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_OSINFO_WINDOWS_VERSION_HPP

Property changes on: src/mpt/osinfo/windows_version.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/out_of_memory/out_of_memory.hpp
===================================================================
--- src/mpt/out_of_memory/out_of_memory.hpp	(nonexistent)
+++ src/mpt/out_of_memory/out_of_memory.hpp	(working copy)
@@ -0,0 +1,77 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP
+#define MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <exception>
+#if !MPT_DETECTED_MFC
+#include <new>
+#endif // !MPT_DETECTED_MFC
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Exception handling helpers, because MFC requires explicit deletion of the exception object,
+// Thus, always call exactly one of mpt::rethrow_out_of_memory(e) or mpt::delete_out_of_memory(e).
+
+#if MPT_DETECTED_MFC
+
+using out_of_memory = CMemoryException *;
+
+[[noreturn]] inline void throw_out_of_memory() {
+	AfxThrowMemoryException();
+}
+
+[[noreturn]] inline void rethrow_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+	throw;
+}
+
+inline void delete_out_of_memory(out_of_memory & e) {
+	if (e) {
+		e->Delete();
+		e = nullptr;
+	}
+}
+
+#else // !MPT_DETECTED_MFC
+
+using out_of_memory = const std::bad_alloc &;
+
+[[noreturn]] inline void throw_out_of_memory() {
+	throw std::bad_alloc();
+}
+
+[[noreturn]] inline void rethrow_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+	throw;
+}
+
+inline void delete_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+}
+
+#endif // MPT_DETECTED_MFC
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP

Property changes on: src/mpt/out_of_memory/out_of_memory.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/out_of_memory/out_of_memory.hpp
===================================================================
--- src/mpt/out_of_memory/out_of_memory.hpp	(nonexistent)
+++ src/mpt/out_of_memory/out_of_memory.hpp	(working copy)
@@ -0,0 +1,77 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP
+#define MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <exception>
+#if !MPT_DETECTED_MFC
+#include <new>
+#endif // !MPT_DETECTED_MFC
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Exception handling helpers, because MFC requires explicit deletion of the exception object,
+// Thus, always call exactly one of mpt::rethrow_out_of_memory(e) or mpt::delete_out_of_memory(e).
+
+#if MPT_DETECTED_MFC
+
+using out_of_memory = CMemoryException *;
+
+[[noreturn]] inline void throw_out_of_memory() {
+	AfxThrowMemoryException();
+}
+
+[[noreturn]] inline void rethrow_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+	throw;
+}
+
+inline void delete_out_of_memory(out_of_memory & e) {
+	if (e) {
+		e->Delete();
+		e = nullptr;
+	}
+}
+
+#else // !MPT_DETECTED_MFC
+
+using out_of_memory = const std::bad_alloc &;
+
+[[noreturn]] inline void throw_out_of_memory() {
+	throw std::bad_alloc();
+}
+
+[[noreturn]] inline void rethrow_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+	throw;
+}
+
+inline void delete_out_of_memory(out_of_memory e) {
+	MPT_UNUSED(e);
+}
+
+#endif // MPT_DETECTED_MFC
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_OUT_OF_MEMORY_OUT_OF_MEMORY_HPP

Property changes on: src/mpt/out_of_memory/out_of_memory.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/crand.hpp
===================================================================
--- src/mpt/random/crand.hpp	(nonexistent)
+++ src/mpt/random/crand.hpp	(working copy)
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_CRAND_HPP
+#define MPT_RANDOM_CRAND_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/numeric.hpp"
+#include "mpt/random/random.hpp"
+
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class crand {
+public:
+	using state_type = void;
+	using result_type = int;
+
+private:
+	static void reseed(uint32 seed) {
+		std::srand(seed);
+	}
+
+public:
+	template <typename Trd>
+	static void reseed(Trd & rd) {
+		reseed(mpt::random<uint32>(rd));
+	}
+
+public:
+	crand() = default;
+	explicit crand(const std::string &) {
+		return;
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return 0;
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return RAND_MAX;
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return mpt::lower_bound_entropy_bits(RAND_MAX);
+	}
+	result_type operator()() {
+		return std::rand();
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_CRAND_HPP

Property changes on: src/mpt/random/crand.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/default_engines.hpp
===================================================================
--- src/mpt/random/default_engines.hpp	(nonexistent)
+++ src/mpt/random/default_engines.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_DEFAULT_ENGINES_HPP
+#define MPT_RANDOM_DEFAULT_ENGINES_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/engine.hpp"
+#include "mpt/random/engine_lcg.hpp"
+
+#include <random>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+using deterministic_fast_engine = mpt::lcg_msvc;
+using deterministic_good_engine = mpt::lcg_musl;
+
+// We cannot use std::minstd_rand here because it has not a power-of-2 sized
+// output domain which we rely upon.
+using fast_engine = mpt::lcg_msvc; // about 3 ALU operations, ~32bit of state, suited for inner loops
+using good_engine = std::ranlux48;
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_DEFAULT_ENGINES_HPP

Property changes on: src/mpt/random/default_engines.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/device.hpp
===================================================================
--- src/mpt/random/device.hpp	(nonexistent)
+++ src/mpt/random/device.hpp	(working copy)
@@ -0,0 +1,303 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_DEVICE_HPP
+#define MPT_RANDOM_DEVICE_HPP
+
+
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/crc/crc.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/mutex/mutex.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/random/engine.hpp"
+#include "mpt/random/engine_lcg.hpp"
+#include "mpt/random/random.hpp"
+
+#include <chrono>
+#include <limits>
+#include <memory>
+#include <random>
+#include <string>
+
+#include <cmath>
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+inline constexpr uint32 DETERMINISTIC_RNG_SEED = 3141592653u; // pi
+
+
+
+template <typename T>
+struct default_radom_seed_hash {
+};
+
+template <>
+struct default_radom_seed_hash<uint8> {
+	using type = mpt::crc16;
+};
+
+template <>
+struct default_radom_seed_hash<uint16> {
+	using type = mpt::crc16;
+};
+
+template <>
+struct default_radom_seed_hash<uint32> {
+	using type = mpt::crc32c;
+};
+
+template <>
+struct default_radom_seed_hash<uint64> {
+	using type = mpt::crc64_jones;
+};
+
+
+class prng_random_device_time_seeder {
+
+public:
+	template <typename T>
+	inline T generate_seed() {
+		// Note: CRC is actually not that good a choice here, but it is simple and we
+		// already have an implementaion available. Better choices for mixing entropy
+		// would be a hash function with proper avalanche characteristics or a block
+		// or stream cipher with any pre-choosen random key and IV. The only aspect we
+		// really need here is whitening of the bits.
+		typename mpt::default_radom_seed_hash<T>::type hash;
+
+		{
+			uint64be time;
+			time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock().now().time_since_epoch()).count();
+			std::byte bytes[sizeof(time)];
+			std::memcpy(bytes, &time, sizeof(time));
+			hash(std::begin(bytes), std::end(bytes));
+		}
+#if !defined(MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK)
+		// Avoid std::chrono::high_resolution_clock on Emscripten because availability is problematic in AudioWorklet context.
+		{
+			uint64be time;
+			time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock().now().time_since_epoch()).count();
+			std::byte bytes[sizeof(time)];
+			std::memcpy(bytes, &time, sizeof(time));
+			hash(std::begin(bytes), std::end(bytes));
+		}
+#endif // !MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK
+
+		return static_cast<T>(hash.result());
+	}
+
+public:
+	prng_random_device_time_seeder() = default;
+};
+
+
+//  C++11 std::random_device may be implemented as a deterministic PRNG.
+//  There is no way to seed this PRNG and it is allowed to be seeded with the
+// same value on each program invocation. This makes std::random_device
+// completely useless even as a non-cryptographic entropy pool.
+//  We fallback to time-seeded std::mt19937 if std::random_device::entropy() is
+// 0 or less.
+class sane_random_device {
+private:
+	mpt::mutex m;
+	std::string token;
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+	std::unique_ptr<std::random_device> prd;
+	bool rd_reliable{false};
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	std::unique_ptr<std::mt19937> rd_fallback;
+
+public:
+	using result_type = unsigned int;
+
+private:
+	void init_fallback() {
+		if (!rd_fallback) {
+			if (token.length() > 0) {
+				uint64 seed_val = mpt::prng_random_device_time_seeder().generate_seed<uint64>();
+				std::vector<unsigned int> seeds;
+				seeds.push_back(static_cast<uint32>(seed_val >> 32));
+				seeds.push_back(static_cast<uint32>(seed_val >> 0));
+				for (std::size_t i = 0; i < token.length(); ++i) {
+					seeds.push_back(static_cast<unsigned int>(static_cast<unsigned char>(token[i])));
+				}
+				std::seed_seq seed(seeds.begin(), seeds.end());
+				rd_fallback = std::make_unique<std::mt19937>(seed);
+			} else {
+				uint64 seed_val = mpt::prng_random_device_time_seeder().generate_seed<uint64>();
+				unsigned int seeds[2];
+				seeds[0] = static_cast<uint32>(seed_val >> 32);
+				seeds[1] = static_cast<uint32>(seed_val >> 0);
+				std::seed_seq seed(seeds + 0, seeds + 2);
+				rd_fallback = std::make_unique<std::mt19937>(seed);
+			}
+		}
+	}
+
+public:
+	sane_random_device() {
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		try {
+			prd = std::make_unique<std::random_device>();
+			rd_reliable = ((*prd).entropy() > 0.0);
+		} catch (mpt::out_of_memory e) {
+			mpt::rethrow_out_of_memory(e);
+		} catch (const std::exception &) {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			init_fallback();
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		init_fallback();
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	}
+	sane_random_device(const std::string & token_)
+		: token(token_) {
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		try {
+			prd = std::make_unique<std::random_device>(token);
+			rd_reliable = ((*prd).entropy() > 0.0);
+		} catch (mpt::out_of_memory e) {
+			mpt::rethrow_out_of_memory(e);
+		} catch (const std::exception &) {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			init_fallback();
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		init_fallback();
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	}
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return std::numeric_limits<result_type>::min();
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return std::numeric_limits<result_type>::max();
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return sizeof(result_type) * 8;
+	}
+	result_type operator()() {
+		mpt::lock_guard<mpt::mutex> l(m);
+		result_type result = 0;
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		if (prd) {
+			try {
+				if constexpr (std::random_device::min() != 0 || !mpt::is_mask(std::random_device::max())) {
+					// insane std::random_device
+					//  This implementation is not exactly uniformly distributed but good enough
+					// for OpenMPT.
+					constexpr double rd_min = static_cast<double>(std::random_device::min());
+					constexpr double rd_max = static_cast<double>(std::random_device::max());
+					constexpr double rd_range = rd_max - rd_min;
+					constexpr double rd_size = rd_range + 1.0;
+					const double rd_entropy = std::log2(rd_size);
+					const int iterations = static_cast<int>(std::ceil(result_bits() / rd_entropy));
+					double tmp = 0.0;
+					for (int i = 0; i < iterations; ++i) {
+						tmp = (tmp * rd_size) + (static_cast<double>((*prd)()) - rd_min);
+					}
+					double result_01 = std::floor(tmp / std::pow(rd_size, iterations));
+					result = static_cast<result_type>(std::floor(result_01 * (static_cast<double>(max() - min()) + 1.0))) + min();
+				} else {
+					// sane std::random_device
+					result = 0;
+					std::size_t rd_bits = mpt::lower_bound_entropy_bits(std::random_device::max());
+					for (std::size_t entropy = 0; entropy < (sizeof(result_type) * 8); entropy += rd_bits) {
+						if (rd_bits < (sizeof(result_type) * 8)) {
+							result = (result << rd_bits) | static_cast<result_type>((*prd)());
+						} else {
+							result = result | static_cast<result_type>((*prd)());
+						}
+					}
+				}
+			} catch (const std::exception &) {
+				rd_reliable = false;
+				init_fallback();
+			}
+		} else {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			// std::random_device is unreliable
+			//  XOR the generated random number with more entropy from the time-seeded
+			// PRNG.
+			//  Note: This is safe even if the std::random_device itself is implemented
+			// as a std::mt19937 PRNG because we are very likely using a different
+			// seed.
+			result ^= mpt::random<result_type>(*rd_fallback);
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		result ^= mpt::random<result_type>(*rd_fallback);
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		return result;
+	}
+};
+
+
+class prng_random_device_deterministic_seeder {
+protected:
+	template <typename T>
+	constexpr T generate_seed() noexcept {
+		return static_cast<T>(mpt::DETERMINISTIC_RNG_SEED);
+	}
+
+protected:
+	prng_random_device_deterministic_seeder() = default;
+};
+
+template <typename Trng = mpt::lcg_musl, typename seeder = mpt::prng_random_device_time_seeder>
+class prng_random_device
+	: private seeder {
+public:
+	using result_type = unsigned int;
+
+private:
+	mpt::mutex m;
+	Trng rng;
+
+public:
+	prng_random_device()
+		: rng(seeder::template generate_seed<typename Trng::state_type>()) {
+		return;
+	}
+	prng_random_device(const std::string &)
+		: rng(seeder::template generate_seed<typename Trng::state_type>()) {
+		return;
+	}
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return std::numeric_limits<unsigned int>::min();
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return std::numeric_limits<unsigned int>::max();
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return sizeof(unsigned int) * 8;
+	}
+	result_type operator()() {
+		mpt::lock_guard<mpt::mutex> l(m);
+		return mpt::random<unsigned int>(rng);
+	}
+};
+
+
+using deterministc_random_device = mpt::prng_random_device<mpt::lcg_musl>;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_DEVICE_HPP

Property changes on: src/mpt/random/device.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/engine.hpp
===================================================================
--- src/mpt/random/engine.hpp	(nonexistent)
+++ src/mpt/random/engine.hpp	(working copy)
@@ -0,0 +1,166 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_ENGINE_HPP
+#define MPT_RANDOM_ENGINE_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/seed.hpp"
+
+#include <memory>
+#include <random>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Trng>
+struct engine_traits {
+	typedef typename Trng::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return Trng::result_bits();
+	}
+	template <typename Trd>
+	static inline Trng make(Trd & rd) {
+		return Trng(rd);
+	}
+};
+
+// C++11 random does not provide any sane way to determine the amount of entropy
+// required to seed a particular engine. VERY STUPID.
+// List the ones we are likely to use.
+
+template <>
+struct engine_traits<std::mt19937> {
+	enum : std::size_t
+	{
+		seed_bits = sizeof(std::mt19937::result_type) * 8 * std::mt19937::state_size
+	};
+	typedef std::mt19937 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		std::unique_ptr<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>> values = std::make_unique<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>>(rd);
+		std::seed_seq seed(values->begin(), values->end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::mt19937_64> {
+	enum : std::size_t
+	{
+		seed_bits = sizeof(std::mt19937_64::result_type) * 8 * std::mt19937_64::state_size
+	};
+	typedef std::mt19937_64 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		std::unique_ptr<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>> values = std::make_unique<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>>(rd);
+		std::seed_seq seed(values->begin(), values->end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux24_base> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux24_base::word_size
+	};
+	typedef std::ranlux24_base rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux48_base> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux48_base::word_size
+	};
+	typedef std::ranlux48_base rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux24> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux24_base::word_size
+	};
+	typedef std::ranlux24 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return std::ranlux24_base::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux48> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux48_base::word_size
+	};
+	typedef std::ranlux48 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return std::ranlux48_base::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+
+
+template <typename Trng, typename Trd>
+inline Trng make_prng(Trd & rd) {
+	return mpt::engine_traits<Trng>::make(rd);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_ENGINE_HPP

Property changes on: src/mpt/random/engine.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/engine_lcg.hpp
===================================================================
--- src/mpt/random/engine_lcg.hpp	(nonexistent)
+++ src/mpt/random/engine_lcg.hpp	(working copy)
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_ENGINE_LCG_HPP
+#define MPT_RANDOM_ENGINE_LCG_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/random.hpp"
+
+#include <random>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4724) // potential mod by 0
+#endif                          // MPT_COMPILER_MSVC
+
+template <typename Tstate, typename Tvalue, Tstate m, Tstate a, Tstate c, Tstate result_mask, int result_shift, int result_bits_>
+class lcg_engine {
+public:
+	typedef Tstate state_type;
+	typedef Tvalue result_type;
+
+private:
+	state_type state;
+
+public:
+	template <typename Trng>
+	explicit inline lcg_engine(Trng & rd)
+		: state(mpt::random<state_type>(rd)) {
+		operator()(); // we return results from the current state and update state after returning. results in better pipelining.
+	}
+	explicit inline lcg_engine(state_type seed)
+		: state(seed) {
+		operator()(); // we return results from the current state and update state after returning. results in better pipelining.
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return static_cast<result_type>(0);
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		static_assert(((result_mask >> result_shift) << result_shift) == result_mask);
+		return static_cast<result_type>(result_mask >> result_shift);
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		static_assert(((static_cast<Tstate>(1) << result_bits_) - 1) == (result_mask >> result_shift));
+		return result_bits_;
+	}
+	inline result_type operator()() {
+		// we return results from the current state and update state after returning. results in better pipelining.
+		state_type s = state;
+		result_type result = static_cast<result_type>((s & result_mask) >> result_shift);
+		s = mpt::modulo_if_not_zero<state_type, m>((a * s) + c);
+		state = s;
+		return result;
+	}
+};
+
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+
+typedef lcg_engine<uint32, uint16, 0u, 214013u, 2531011u, 0x7fff0000u, 16, 15> lcg_msvc;
+typedef lcg_engine<uint32, uint16, 0x80000000u, 1103515245u, 12345u, 0x7fff0000u, 16, 15> lcg_c99;
+typedef lcg_engine<uint64, uint32, 0ull, 6364136223846793005ull, 1ull, 0xffffffff00000000ull, 32, 32> lcg_musl;
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_ENGINE_LCG_HPP

Property changes on: src/mpt/random/engine_lcg.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/random.hpp
===================================================================
--- src/mpt/random/random.hpp	(nonexistent)
+++ src/mpt/random/random.hpp	(working copy)
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_RANDOM_HPP
+#define MPT_RANDOM_RANDOM_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/engine.hpp"
+
+#include <type_traits>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T, typename Trng>
+inline T random(Trng & rng) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < (sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	return static_cast<T>(result);
+}
+
+template <typename T, std::size_t required_entropy_bits, typename Trng>
+inline T random(Trng & rng) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < std::min(required_entropy_bits, sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	if constexpr (required_entropy_bits >= (sizeof(T) * 8)) {
+		return static_cast<T>(result);
+	} else {
+		return static_cast<T>(result & ((static_cast<unsigned_T>(1) << required_entropy_bits) - static_cast<unsigned_T>(1)));
+	}
+}
+
+template <typename T, typename Trng>
+inline T random(Trng & rng, std::size_t required_entropy_bits) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < std::min(required_entropy_bits, sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	if (required_entropy_bits >= (sizeof(T) * 8)) {
+		return static_cast<T>(result);
+	} else {
+		return static_cast<T>(result & ((static_cast<unsigned_T>(1) << required_entropy_bits) - static_cast<unsigned_T>(1)));
+	}
+}
+
+template <typename T>
+struct uniform_real_distribution {
+private:
+	T a;
+	T b;
+
+public:
+	inline uniform_real_distribution(T a_, T b_)
+		: a(a_)
+		, b(b_) {
+		return;
+	}
+	template <typename Trng>
+	inline T operator()(Trng & rng) const {
+		const int mantissa_bits = std::numeric_limits<T>::digits;
+		return ((b - a) * static_cast<T>(mpt::random<uint64, mantissa_bits>(rng)) / static_cast<T>((static_cast<uint64>(1u) << mantissa_bits))) + a;
+	}
+};
+
+
+template <typename T, typename Trng>
+inline T random(Trng & rng, T min, T max) {
+	static_assert(!std::numeric_limits<T>::is_integer);
+	typedef mpt::uniform_real_distribution<T> dis_type;
+	dis_type dis(min, max);
+	return static_cast<T>(dis(rng));
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_RANDOM_HPP

Property changes on: src/mpt/random/random.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/seed.hpp
===================================================================
--- src/mpt/random/seed.hpp	(nonexistent)
+++ src/mpt/random/seed.hpp	(working copy)
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_SEED_HPP
+#define MPT_RANDOM_SEED_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <std::size_t N>
+class seed_seq_values {
+private:
+	std::array<unsigned int, N> seeds;
+
+public:
+	template <typename Trd>
+	explicit seed_seq_values(Trd & rd) {
+		for (std::size_t i = 0; i < N; ++i) {
+			seeds[i] = rd();
+		}
+	}
+	const unsigned int * begin() const {
+		return seeds.data();
+	}
+	const unsigned int * end() const {
+		return seeds.data() + N;
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_SEED_HPP

Property changes on: src/mpt/random/seed.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/tests/tests_random.hpp
===================================================================
--- src/mpt/random/tests/tests_random.hpp	(nonexistent)
+++ src/mpt/random/tests/tests_random.hpp	(working copy)
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_RANDOM_HPP
+#define MPT_BASE_TESTS_RANDOM_HPP
+
+
+
+#include "mpt/base/algorithm.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/random/random.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_random{
+	"mpt/random",
+	[](mpt::test::context & context) {
+		mpt::sane_random_device rd;
+		mpt::good_engine prng = mpt::make_prng<mpt::good_engine>(rd);
+
+		bool failed = false;
+
+		for (std::size_t i = 0; i < 10000; ++i) {
+
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 7>(prng), 0u, 127u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 8>(prng), 0u, 255u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 9>(prng), 0u, 511u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint64, 1>(prng), 0u, 1u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 7), 0u, 127u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 8), 0u, 255u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 9), 0u, 511u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint64>(prng, 1), 0u, 1u);
+
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 7>(prng), 0, 127);
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 8>(prng), 0, 255);
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 9>(prng), 0, 511);
+			failed = failed || !mpt::is_in_range(mpt::random<int64, 1>(prng), 0, 1);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 7), 0, 127);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 8), 0, 255);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 9), 0, 511);
+			failed = failed || !mpt::is_in_range(mpt::random<int64>(prng, 1), 0, 1);
+
+			failed = failed || !mpt::is_in_range(mpt::random<float>(prng, 0.0f, 1.0f), 0.0f, 1.0f);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 0.0, 1.0), 0.0, 1.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 1.0), -1.0, 1.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 0.0), -1.0, 0.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 1.0, 2.0), 1.0, 2.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 1.0, 3.0), 1.0, 3.0);
+		}
+
+		MPT_TEST_EXPECT_EXPR(!failed);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_RANDOM_HPP

Property changes on: src/mpt/random/tests/tests_random.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/crand.hpp
===================================================================
--- src/mpt/random/crand.hpp	(nonexistent)
+++ src/mpt/random/crand.hpp	(working copy)
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_CRAND_HPP
+#define MPT_RANDOM_CRAND_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/numeric.hpp"
+#include "mpt/random/random.hpp"
+
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class crand {
+public:
+	using state_type = void;
+	using result_type = int;
+
+private:
+	static void reseed(uint32 seed) {
+		std::srand(seed);
+	}
+
+public:
+	template <typename Trd>
+	static void reseed(Trd & rd) {
+		reseed(mpt::random<uint32>(rd));
+	}
+
+public:
+	crand() = default;
+	explicit crand(const std::string &) {
+		return;
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return 0;
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return RAND_MAX;
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return mpt::lower_bound_entropy_bits(RAND_MAX);
+	}
+	result_type operator()() {
+		return std::rand();
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_CRAND_HPP

Property changes on: src/mpt/random/crand.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/default_engines.hpp
===================================================================
--- src/mpt/random/default_engines.hpp	(nonexistent)
+++ src/mpt/random/default_engines.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_DEFAULT_ENGINES_HPP
+#define MPT_RANDOM_DEFAULT_ENGINES_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/engine.hpp"
+#include "mpt/random/engine_lcg.hpp"
+
+#include <random>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+using deterministic_fast_engine = mpt::lcg_msvc;
+using deterministic_good_engine = mpt::lcg_musl;
+
+// We cannot use std::minstd_rand here because it has not a power-of-2 sized
+// output domain which we rely upon.
+using fast_engine = mpt::lcg_msvc; // about 3 ALU operations, ~32bit of state, suited for inner loops
+using good_engine = std::ranlux48;
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_DEFAULT_ENGINES_HPP

Property changes on: src/mpt/random/default_engines.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/device.hpp
===================================================================
--- src/mpt/random/device.hpp	(nonexistent)
+++ src/mpt/random/device.hpp	(working copy)
@@ -0,0 +1,303 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_DEVICE_HPP
+#define MPT_RANDOM_DEVICE_HPP
+
+
+
+#include "mpt/base/bit.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/crc/crc.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/mutex/mutex.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/random/engine.hpp"
+#include "mpt/random/engine_lcg.hpp"
+#include "mpt/random/random.hpp"
+
+#include <chrono>
+#include <limits>
+#include <memory>
+#include <random>
+#include <string>
+
+#include <cmath>
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+inline constexpr uint32 DETERMINISTIC_RNG_SEED = 3141592653u; // pi
+
+
+
+template <typename T>
+struct default_radom_seed_hash {
+};
+
+template <>
+struct default_radom_seed_hash<uint8> {
+	using type = mpt::crc16;
+};
+
+template <>
+struct default_radom_seed_hash<uint16> {
+	using type = mpt::crc16;
+};
+
+template <>
+struct default_radom_seed_hash<uint32> {
+	using type = mpt::crc32c;
+};
+
+template <>
+struct default_radom_seed_hash<uint64> {
+	using type = mpt::crc64_jones;
+};
+
+
+class prng_random_device_time_seeder {
+
+public:
+	template <typename T>
+	inline T generate_seed() {
+		// Note: CRC is actually not that good a choice here, but it is simple and we
+		// already have an implementaion available. Better choices for mixing entropy
+		// would be a hash function with proper avalanche characteristics or a block
+		// or stream cipher with any pre-choosen random key and IV. The only aspect we
+		// really need here is whitening of the bits.
+		typename mpt::default_radom_seed_hash<T>::type hash;
+
+		{
+			uint64be time;
+			time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock().now().time_since_epoch()).count();
+			std::byte bytes[sizeof(time)];
+			std::memcpy(bytes, &time, sizeof(time));
+			hash(std::begin(bytes), std::end(bytes));
+		}
+#if !defined(MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK)
+		// Avoid std::chrono::high_resolution_clock on Emscripten because availability is problematic in AudioWorklet context.
+		{
+			uint64be time;
+			time = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock().now().time_since_epoch()).count();
+			std::byte bytes[sizeof(time)];
+			std::memcpy(bytes, &time, sizeof(time));
+			hash(std::begin(bytes), std::end(bytes));
+		}
+#endif // !MPT_COMPILER_QUIRK_CHRONO_NO_HIGH_RESOLUTION_CLOCK
+
+		return static_cast<T>(hash.result());
+	}
+
+public:
+	prng_random_device_time_seeder() = default;
+};
+
+
+//  C++11 std::random_device may be implemented as a deterministic PRNG.
+//  There is no way to seed this PRNG and it is allowed to be seeded with the
+// same value on each program invocation. This makes std::random_device
+// completely useless even as a non-cryptographic entropy pool.
+//  We fallback to time-seeded std::mt19937 if std::random_device::entropy() is
+// 0 or less.
+class sane_random_device {
+private:
+	mpt::mutex m;
+	std::string token;
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+	std::unique_ptr<std::random_device> prd;
+	bool rd_reliable{false};
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	std::unique_ptr<std::mt19937> rd_fallback;
+
+public:
+	using result_type = unsigned int;
+
+private:
+	void init_fallback() {
+		if (!rd_fallback) {
+			if (token.length() > 0) {
+				uint64 seed_val = mpt::prng_random_device_time_seeder().generate_seed<uint64>();
+				std::vector<unsigned int> seeds;
+				seeds.push_back(static_cast<uint32>(seed_val >> 32));
+				seeds.push_back(static_cast<uint32>(seed_val >> 0));
+				for (std::size_t i = 0; i < token.length(); ++i) {
+					seeds.push_back(static_cast<unsigned int>(static_cast<unsigned char>(token[i])));
+				}
+				std::seed_seq seed(seeds.begin(), seeds.end());
+				rd_fallback = std::make_unique<std::mt19937>(seed);
+			} else {
+				uint64 seed_val = mpt::prng_random_device_time_seeder().generate_seed<uint64>();
+				unsigned int seeds[2];
+				seeds[0] = static_cast<uint32>(seed_val >> 32);
+				seeds[1] = static_cast<uint32>(seed_val >> 0);
+				std::seed_seq seed(seeds + 0, seeds + 2);
+				rd_fallback = std::make_unique<std::mt19937>(seed);
+			}
+		}
+	}
+
+public:
+	sane_random_device() {
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		try {
+			prd = std::make_unique<std::random_device>();
+			rd_reliable = ((*prd).entropy() > 0.0);
+		} catch (mpt::out_of_memory e) {
+			mpt::rethrow_out_of_memory(e);
+		} catch (const std::exception &) {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			init_fallback();
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		init_fallback();
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	}
+	sane_random_device(const std::string & token_)
+		: token(token_) {
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		try {
+			prd = std::make_unique<std::random_device>(token);
+			rd_reliable = ((*prd).entropy() > 0.0);
+		} catch (mpt::out_of_memory e) {
+			mpt::rethrow_out_of_memory(e);
+		} catch (const std::exception &) {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			init_fallback();
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		init_fallback();
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+	}
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return std::numeric_limits<result_type>::min();
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return std::numeric_limits<result_type>::max();
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return sizeof(result_type) * 8;
+	}
+	result_type operator()() {
+		mpt::lock_guard<mpt::mutex> l(m);
+		result_type result = 0;
+#if !defined(MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE)
+		if (prd) {
+			try {
+				if constexpr (std::random_device::min() != 0 || !mpt::is_mask(std::random_device::max())) {
+					// insane std::random_device
+					//  This implementation is not exactly uniformly distributed but good enough
+					// for OpenMPT.
+					constexpr double rd_min = static_cast<double>(std::random_device::min());
+					constexpr double rd_max = static_cast<double>(std::random_device::max());
+					constexpr double rd_range = rd_max - rd_min;
+					constexpr double rd_size = rd_range + 1.0;
+					const double rd_entropy = std::log2(rd_size);
+					const int iterations = static_cast<int>(std::ceil(result_bits() / rd_entropy));
+					double tmp = 0.0;
+					for (int i = 0; i < iterations; ++i) {
+						tmp = (tmp * rd_size) + (static_cast<double>((*prd)()) - rd_min);
+					}
+					double result_01 = std::floor(tmp / std::pow(rd_size, iterations));
+					result = static_cast<result_type>(std::floor(result_01 * (static_cast<double>(max() - min()) + 1.0))) + min();
+				} else {
+					// sane std::random_device
+					result = 0;
+					std::size_t rd_bits = mpt::lower_bound_entropy_bits(std::random_device::max());
+					for (std::size_t entropy = 0; entropy < (sizeof(result_type) * 8); entropy += rd_bits) {
+						if (rd_bits < (sizeof(result_type) * 8)) {
+							result = (result << rd_bits) | static_cast<result_type>((*prd)());
+						} else {
+							result = result | static_cast<result_type>((*prd)());
+						}
+					}
+				}
+			} catch (const std::exception &) {
+				rd_reliable = false;
+				init_fallback();
+			}
+		} else {
+			rd_reliable = false;
+		}
+		if (!rd_reliable) {
+			// std::random_device is unreliable
+			//  XOR the generated random number with more entropy from the time-seeded
+			// PRNG.
+			//  Note: This is safe even if the std::random_device itself is implemented
+			// as a std::mt19937 PRNG because we are very likely using a different
+			// seed.
+			result ^= mpt::random<result_type>(*rd_fallback);
+		}
+#else  // MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		result ^= mpt::random<result_type>(*rd_fallback);
+#endif // !MPT_COMPILER_QUIRK_RANDOM_NO_RANDOM_DEVICE
+		return result;
+	}
+};
+
+
+class prng_random_device_deterministic_seeder {
+protected:
+	template <typename T>
+	constexpr T generate_seed() noexcept {
+		return static_cast<T>(mpt::DETERMINISTIC_RNG_SEED);
+	}
+
+protected:
+	prng_random_device_deterministic_seeder() = default;
+};
+
+template <typename Trng = mpt::lcg_musl, typename seeder = mpt::prng_random_device_time_seeder>
+class prng_random_device
+	: private seeder {
+public:
+	using result_type = unsigned int;
+
+private:
+	mpt::mutex m;
+	Trng rng;
+
+public:
+	prng_random_device()
+		: rng(seeder::template generate_seed<typename Trng::state_type>()) {
+		return;
+	}
+	prng_random_device(const std::string &)
+		: rng(seeder::template generate_seed<typename Trng::state_type>()) {
+		return;
+	}
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return std::numeric_limits<unsigned int>::min();
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		return std::numeric_limits<unsigned int>::max();
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return sizeof(unsigned int) * 8;
+	}
+	result_type operator()() {
+		mpt::lock_guard<mpt::mutex> l(m);
+		return mpt::random<unsigned int>(rng);
+	}
+};
+
+
+using deterministc_random_device = mpt::prng_random_device<mpt::lcg_musl>;
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_DEVICE_HPP

Property changes on: src/mpt/random/device.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/engine.hpp
===================================================================
--- src/mpt/random/engine.hpp	(nonexistent)
+++ src/mpt/random/engine.hpp	(working copy)
@@ -0,0 +1,166 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_ENGINE_HPP
+#define MPT_RANDOM_ENGINE_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/seed.hpp"
+
+#include <memory>
+#include <random>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Trng>
+struct engine_traits {
+	typedef typename Trng::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return Trng::result_bits();
+	}
+	template <typename Trd>
+	static inline Trng make(Trd & rd) {
+		return Trng(rd);
+	}
+};
+
+// C++11 random does not provide any sane way to determine the amount of entropy
+// required to seed a particular engine. VERY STUPID.
+// List the ones we are likely to use.
+
+template <>
+struct engine_traits<std::mt19937> {
+	enum : std::size_t
+	{
+		seed_bits = sizeof(std::mt19937::result_type) * 8 * std::mt19937::state_size
+	};
+	typedef std::mt19937 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		std::unique_ptr<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>> values = std::make_unique<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>>(rd);
+		std::seed_seq seed(values->begin(), values->end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::mt19937_64> {
+	enum : std::size_t
+	{
+		seed_bits = sizeof(std::mt19937_64::result_type) * 8 * std::mt19937_64::state_size
+	};
+	typedef std::mt19937_64 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		std::unique_ptr<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>> values = std::make_unique<mpt::seed_seq_values<seed_bits / sizeof(unsigned int)>>(rd);
+		std::seed_seq seed(values->begin(), values->end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux24_base> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux24_base::word_size
+	};
+	typedef std::ranlux24_base rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux48_base> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux48_base::word_size
+	};
+	typedef std::ranlux48_base rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return rng_type::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux24> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux24_base::word_size
+	};
+	typedef std::ranlux24 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return std::ranlux24_base::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+template <>
+struct engine_traits<std::ranlux48> {
+	enum : std::size_t
+	{
+		seed_bits = std::ranlux48_base::word_size
+	};
+	typedef std::ranlux48 rng_type;
+	typedef rng_type::result_type result_type;
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		return std::ranlux48_base::word_size;
+	}
+	template <typename Trd>
+	static inline rng_type make(Trd & rd) {
+		mpt::seed_seq_values<seed_bits / sizeof(unsigned int)> values(rd);
+		std::seed_seq seed(values.begin(), values.end());
+		return rng_type(seed);
+	}
+};
+
+
+
+template <typename Trng, typename Trd>
+inline Trng make_prng(Trd & rd) {
+	return mpt::engine_traits<Trng>::make(rd);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_ENGINE_HPP

Property changes on: src/mpt/random/engine.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/engine_lcg.hpp
===================================================================
--- src/mpt/random/engine_lcg.hpp	(nonexistent)
+++ src/mpt/random/engine_lcg.hpp	(working copy)
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_ENGINE_LCG_HPP
+#define MPT_RANDOM_ENGINE_LCG_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/random.hpp"
+
+#include <random>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4724) // potential mod by 0
+#endif                          // MPT_COMPILER_MSVC
+
+template <typename Tstate, typename Tvalue, Tstate m, Tstate a, Tstate c, Tstate result_mask, int result_shift, int result_bits_>
+class lcg_engine {
+public:
+	typedef Tstate state_type;
+	typedef Tvalue result_type;
+
+private:
+	state_type state;
+
+public:
+	template <typename Trng>
+	explicit inline lcg_engine(Trng & rd)
+		: state(mpt::random<state_type>(rd)) {
+		operator()(); // we return results from the current state and update state after returning. results in better pipelining.
+	}
+	explicit inline lcg_engine(state_type seed)
+		: state(seed) {
+		operator()(); // we return results from the current state and update state after returning. results in better pipelining.
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE result_type min() {
+		return static_cast<result_type>(0);
+	}
+	static MPT_CONSTEXPRINLINE result_type max() {
+		static_assert(((result_mask >> result_shift) << result_shift) == result_mask);
+		return static_cast<result_type>(result_mask >> result_shift);
+	}
+	static MPT_CONSTEXPRINLINE int result_bits() {
+		static_assert(((static_cast<Tstate>(1) << result_bits_) - 1) == (result_mask >> result_shift));
+		return result_bits_;
+	}
+	inline result_type operator()() {
+		// we return results from the current state and update state after returning. results in better pipelining.
+		state_type s = state;
+		result_type result = static_cast<result_type>((s & result_mask) >> result_shift);
+		s = mpt::modulo_if_not_zero<state_type, m>((a * s) + c);
+		state = s;
+		return result;
+	}
+};
+
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+
+typedef lcg_engine<uint32, uint16, 0u, 214013u, 2531011u, 0x7fff0000u, 16, 15> lcg_msvc;
+typedef lcg_engine<uint32, uint16, 0x80000000u, 1103515245u, 12345u, 0x7fff0000u, 16, 15> lcg_c99;
+typedef lcg_engine<uint64, uint32, 0ull, 6364136223846793005ull, 1ull, 0xffffffff00000000ull, 32, 32> lcg_musl;
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_ENGINE_LCG_HPP

Property changes on: src/mpt/random/engine_lcg.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/random.hpp
===================================================================
--- src/mpt/random/random.hpp	(nonexistent)
+++ src/mpt/random/random.hpp	(working copy)
@@ -0,0 +1,113 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_RANDOM_HPP
+#define MPT_RANDOM_RANDOM_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/engine.hpp"
+
+#include <type_traits>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename T, typename Trng>
+inline T random(Trng & rng) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < (sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	return static_cast<T>(result);
+}
+
+template <typename T, std::size_t required_entropy_bits, typename Trng>
+inline T random(Trng & rng) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < std::min(required_entropy_bits, sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	if constexpr (required_entropy_bits >= (sizeof(T) * 8)) {
+		return static_cast<T>(result);
+	} else {
+		return static_cast<T>(result & ((static_cast<unsigned_T>(1) << required_entropy_bits) - static_cast<unsigned_T>(1)));
+	}
+}
+
+template <typename T, typename Trng>
+inline T random(Trng & rng, std::size_t required_entropy_bits) {
+	static_assert(std::numeric_limits<T>::is_integer);
+	typedef typename std::make_unsigned<T>::type unsigned_T;
+	const unsigned int rng_bits = mpt::engine_traits<Trng>::result_bits();
+	unsigned_T result = 0;
+	for (std::size_t entropy = 0; entropy < std::min(required_entropy_bits, sizeof(T) * 8); entropy += rng_bits) {
+		if constexpr (rng_bits < (sizeof(T) * 8)) {
+			constexpr unsigned int shift_bits = rng_bits % (sizeof(T) * 8); // silence utterly stupid MSVC and GCC warnings about shifting by too big amount (in which case this branch is not even taken however)
+			result = (result << shift_bits) ^ static_cast<unsigned_T>(rng());
+		} else {
+			result = static_cast<unsigned_T>(rng());
+		}
+	}
+	if (required_entropy_bits >= (sizeof(T) * 8)) {
+		return static_cast<T>(result);
+	} else {
+		return static_cast<T>(result & ((static_cast<unsigned_T>(1) << required_entropy_bits) - static_cast<unsigned_T>(1)));
+	}
+}
+
+template <typename T>
+struct uniform_real_distribution {
+private:
+	T a;
+	T b;
+
+public:
+	inline uniform_real_distribution(T a_, T b_)
+		: a(a_)
+		, b(b_) {
+		return;
+	}
+	template <typename Trng>
+	inline T operator()(Trng & rng) const {
+		const int mantissa_bits = std::numeric_limits<T>::digits;
+		return ((b - a) * static_cast<T>(mpt::random<uint64, mantissa_bits>(rng)) / static_cast<T>((static_cast<uint64>(1u) << mantissa_bits))) + a;
+	}
+};
+
+
+template <typename T, typename Trng>
+inline T random(Trng & rng, T min, T max) {
+	static_assert(!std::numeric_limits<T>::is_integer);
+	typedef mpt::uniform_real_distribution<T> dis_type;
+	dis_type dis(min, max);
+	return static_cast<T>(dis(rng));
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_RANDOM_HPP

Property changes on: src/mpt/random/random.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/seed.hpp
===================================================================
--- src/mpt/random/seed.hpp	(nonexistent)
+++ src/mpt/random/seed.hpp	(working copy)
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_RANDOM_SEED_HPP
+#define MPT_RANDOM_SEED_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+
+#include <array>
+
+#include <cstddef>
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <std::size_t N>
+class seed_seq_values {
+private:
+	std::array<unsigned int, N> seeds;
+
+public:
+	template <typename Trd>
+	explicit seed_seq_values(Trd & rd) {
+		for (std::size_t i = 0; i < N; ++i) {
+			seeds[i] = rd();
+		}
+	}
+	const unsigned int * begin() const {
+		return seeds.data();
+	}
+	const unsigned int * end() const {
+		return seeds.data() + N;
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_RANDOM_SEED_HPP

Property changes on: src/mpt/random/seed.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/tests/tests_random.hpp
===================================================================
--- src/mpt/random/tests/tests_random.hpp	(nonexistent)
+++ src/mpt/random/tests/tests_random.hpp	(working copy)
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_RANDOM_HPP
+#define MPT_BASE_TESTS_RANDOM_HPP
+
+
+
+#include "mpt/base/algorithm.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/random/random.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_random{
+	"mpt/random",
+	[](mpt::test::context & context) {
+		mpt::sane_random_device rd;
+		mpt::good_engine prng = mpt::make_prng<mpt::good_engine>(rd);
+
+		bool failed = false;
+
+		for (std::size_t i = 0; i < 10000; ++i) {
+
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 7>(prng), 0u, 127u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 8>(prng), 0u, 255u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 9>(prng), 0u, 511u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint64, 1>(prng), 0u, 1u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 7), 0u, 127u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 8), 0u, 255u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 9), 0u, 511u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint64>(prng, 1), 0u, 1u);
+
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 7>(prng), 0, 127);
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 8>(prng), 0, 255);
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 9>(prng), 0, 511);
+			failed = failed || !mpt::is_in_range(mpt::random<int64, 1>(prng), 0, 1);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 7), 0, 127);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 8), 0, 255);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 9), 0, 511);
+			failed = failed || !mpt::is_in_range(mpt::random<int64>(prng, 1), 0, 1);
+
+			failed = failed || !mpt::is_in_range(mpt::random<float>(prng, 0.0f, 1.0f), 0.0f, 1.0f);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 0.0, 1.0), 0.0, 1.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 1.0), -1.0, 1.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 0.0), -1.0, 0.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 1.0, 2.0), 1.0, 2.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 1.0, 3.0), 1.0, 3.0);
+		}
+
+		MPT_TEST_EXPECT_EXPR(!failed);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_RANDOM_HPP

Property changes on: src/mpt/random/tests/tests_random.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/random/tests/tests_random.hpp
===================================================================
--- src/mpt/random/tests/tests_random.hpp	(nonexistent)
+++ src/mpt/random/tests/tests_random.hpp	(working copy)
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_RANDOM_HPP
+#define MPT_BASE_TESTS_RANDOM_HPP
+
+
+
+#include "mpt/base/algorithm.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/random/random.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_random{
+	"mpt/random",
+	[](mpt::test::context & context) {
+		mpt::sane_random_device rd;
+		mpt::good_engine prng = mpt::make_prng<mpt::good_engine>(rd);
+
+		bool failed = false;
+
+		for (std::size_t i = 0; i < 10000; ++i) {
+
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 7>(prng), 0u, 127u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 8>(prng), 0u, 255u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16, 9>(prng), 0u, 511u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint64, 1>(prng), 0u, 1u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 7), 0u, 127u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 8), 0u, 255u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint16>(prng, 9), 0u, 511u);
+			failed = failed || !mpt::is_in_range(mpt::random<uint64>(prng, 1), 0u, 1u);
+
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 7>(prng), 0, 127);
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 8>(prng), 0, 255);
+			failed = failed || !mpt::is_in_range(mpt::random<int16, 9>(prng), 0, 511);
+			failed = failed || !mpt::is_in_range(mpt::random<int64, 1>(prng), 0, 1);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 7), 0, 127);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 8), 0, 255);
+			failed = failed || !mpt::is_in_range(mpt::random<int16>(prng, 9), 0, 511);
+			failed = failed || !mpt::is_in_range(mpt::random<int64>(prng, 1), 0, 1);
+
+			failed = failed || !mpt::is_in_range(mpt::random<float>(prng, 0.0f, 1.0f), 0.0f, 1.0f);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 0.0, 1.0), 0.0, 1.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 1.0), -1.0, 1.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, -1.0, 0.0), -1.0, 0.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 1.0, 2.0), 1.0, 2.0);
+			failed = failed || !mpt::is_in_range(mpt::random<double>(prng, 1.0, 3.0), 1.0, 3.0);
+		}
+
+		MPT_TEST_EXPECT_EXPR(!failed);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_RANDOM_HPP

Property changes on: src/mpt/random/tests/tests_random.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/buffer.hpp
===================================================================
--- src/mpt/string/buffer.hpp	(nonexistent)
+++ src/mpt/string/buffer.hpp	(working copy)
@@ -0,0 +1,344 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_BUFFER_HPP
+#define MPT_STRING_BUFFER_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/types.hpp"
+
+#include <algorithm>
+#include <array>
+#include <string>
+#include <string_view>
+#include <type_traits>
+
+#include <cassert>
+#include <cstddef>
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+
+template <typename Tstring, typename Tchar>
+class StringBufRefImpl {
+private:
+	Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit StringBufRefImpl(Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		static_assert(sizeof(Tchar) == sizeof(typename Tstring::value_type));
+		assert(size > 0);
+	}
+	StringBufRefImpl(const StringBufRefImpl &) = delete;
+	StringBufRefImpl(StringBufRefImpl &&) = default;
+	StringBufRefImpl & operator=(const StringBufRefImpl &) = delete;
+	StringBufRefImpl & operator=(StringBufRefImpl &&) = delete;
+	operator Tstring() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return Tstring(buf, buf + len);
+	}
+	explicit operator std::basic_string_view<Tchar>() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return std::basic_string_view<Tchar>(buf, buf + len);
+	}
+	bool empty() const {
+		return buf[0] == Tchar('\0');
+	}
+	StringBufRefImpl & operator=(const Tstring & str) {
+		std::copy(str.data(), str.data() + std::min(str.length(), size - 1), buf);
+		std::fill(buf + std::min(str.length(), size - 1), buf + size, Tchar('\0'));
+		return *this;
+	}
+};
+
+template <typename Tstring, typename Tchar>
+class StringBufRefImpl<Tstring, const Tchar> {
+private:
+	const Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit StringBufRefImpl(const Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		static_assert(sizeof(Tchar) == sizeof(typename Tstring::value_type));
+		assert(size > 0);
+	}
+	StringBufRefImpl(const StringBufRefImpl &) = delete;
+	StringBufRefImpl(StringBufRefImpl &&) = default;
+	StringBufRefImpl & operator=(const StringBufRefImpl &) = delete;
+	StringBufRefImpl & operator=(StringBufRefImpl &&) = delete;
+	operator Tstring() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return Tstring(buf, buf + len);
+	}
+	explicit operator std::basic_string_view<Tchar>() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return std::basic_string_view<Tchar>(buf, len);
+	}
+	bool empty() const {
+		return buf[0] == Tchar('\0');
+	}
+};
+
+
+
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tstring, typename Tchar>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<Tstring, Tchar>(buf.data(), size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<Tstring, Tchar>(buf, size);
+}
+template <typename Tstring, typename Tchar>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<Tstring, Tchar>(buf, size);
+}
+
+
+
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf, size);
+}
+
+
+
+#if MPT_OS_WINDOWS
+
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf, size);
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_DETECTED_MFC
+
+template <typename Tchar>
+class CStringBufRefImpl {
+private:
+	Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit CStringBufRefImpl(Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		assert(size > 0);
+	}
+	CStringBufRefImpl(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl(CStringBufRefImpl &&) = default;
+	CStringBufRefImpl & operator=(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl & operator=(CStringBufRefImpl &&) = delete;
+	operator CString() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return CString(buf, mpt::saturate_cast<int>(len));
+	}
+	CStringBufRefImpl & operator=(const CString & str) {
+		std::copy(str.GetString(), str.GetString() + std::min(static_cast<std::size_t>(str.GetLength()), size - 1), buf);
+		std::fill(buf + std::min(static_cast<std::size_t>(str.GetLength()), size - 1), buf + size, Tchar('\0'));
+		return *this;
+	}
+};
+
+template <typename Tchar>
+class CStringBufRefImpl<const Tchar> {
+private:
+	const Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit CStringBufRefImpl(const Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		assert(size > 0);
+	}
+	CStringBufRefImpl(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl(CStringBufRefImpl &&) = default;
+	CStringBufRefImpl & operator=(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl & operator=(CStringBufRefImpl &&) = delete;
+	operator CString() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return CString(buf, mpt::saturate_cast<int>(len));
+	}
+};
+
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const std::array<Tchar, size> & buf) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const Tchar (&buf)[size]) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const Tchar * buf, std::size_t size) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(std::array<Tchar, size> & buf) {
+	return CStringBufRefImpl<Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(Tchar (&buf)[size]) {
+	return CStringBufRefImpl<Tchar>(buf, size);
+}
+template <typename Tchar>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(Tchar * buf, std::size_t size) {
+	return CStringBufRefImpl<Tchar>(buf, size);
+}
+
+#endif // MPT_DETECTED_MFC
+
+
+
+template <std::size_t len>
+struct charbuf {
+public:
+	using Tchar = char;
+	using char_type = Tchar;
+	using string_type = std::basic_string<Tchar>;
+	using string_view_type = std::basic_string_view<Tchar>;
+	constexpr std::size_t static_length() const {
+		return len;
+	}
+
+public:
+	Tchar buf[len];
+
+public:
+	charbuf() {
+		std::fill(std::begin(buf), std::end(buf), Tchar('\0'));
+	}
+	charbuf(const charbuf &) = default;
+	charbuf(charbuf &&) = default;
+	charbuf & operator=(const charbuf &) = default;
+	charbuf & operator=(charbuf &&) = default;
+	const Tchar & operator[](std::size_t i) const {
+		return buf[i];
+	}
+	std::string str() const {
+		return static_cast<std::string>(*this);
+	}
+	operator string_type() const {
+		return mpt::ReadAutoBuf(buf);
+	}
+	explicit operator string_view_type() const {
+		return static_cast<string_view_type>(mpt::ReadAutoBuf(buf));
+	}
+	bool empty() const {
+		return mpt::ReadAutoBuf(buf).empty();
+	}
+	charbuf & operator=(const string_type & str) {
+		mpt::WriteAutoBuf(buf) = str;
+		return *this;
+	}
+
+public:
+	friend bool operator!=(const charbuf & a, const charbuf & b) {
+		return static_cast<string_view_type>(a) != static_cast<string_view_type>(b);
+	}
+	friend bool operator!=(const std::string & a, const charbuf & b) {
+		return a != static_cast<string_view_type>(b);
+	}
+	friend bool operator!=(const charbuf & a, const std::string & b) {
+		return static_cast<string_view_type>(a) != b;
+	}
+	friend bool operator==(const charbuf & a, const charbuf & b) {
+		return static_cast<string_view_type>(a) == static_cast<string_view_type>(b);
+	}
+	friend bool operator==(const std::string & a, const charbuf & b) {
+		return a == static_cast<string_view_type>(b);
+	}
+	friend bool operator==(const charbuf & a, const std::string & b) {
+		return static_cast<string_view_type>(a) == b;
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_BUFFER_HPP

Property changes on: src/mpt/string/buffer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/convert.hpp
===================================================================
--- src/mpt/string/convert.hpp	(nonexistent)
+++ src/mpt/string/convert.hpp	(working copy)
@@ -0,0 +1,1131 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_CONVERT_HPP
+#define MPT_STRING_CONVERT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#include <locale>
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#include <stdexcept>
+#include <string>
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#include <type_traits>
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#include <vector>
+
+#if MPT_OS_DJGPP
+#include <cstring>
+#endif // MPT_OS_DJGPP
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_DJGPP
+#include <dpmi.h>
+#endif // MPT_OS_DJGPP
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+/*
+default 1:1 mapping
+inline constexpr char32_t CharsetTableISO8859_1[256] = {
+	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
+	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
+	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
+	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
+	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
+	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
+	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
+	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
+	0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f,
+	0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f,
+	0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
+	0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf,
+	0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
+	0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
+	0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
+	0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
+};
+*/
+
+inline constexpr char32_t CharsetTableISO8859_15[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+	0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+	0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+	0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+	0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
+	0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+	0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+	0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+	0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
+
+inline constexpr char32_t CharsetTableWindows1252[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+	0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f,
+	0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178,
+	0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+	0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+	0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+	0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+	0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+	0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
+
+inline constexpr char32_t CharsetTableCP850[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+	0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+	0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00F8, 0x00a3, 0x00D8, 0x00D7, 0x0192,
+	0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x00AE, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00A2, 0x00A5, 0x2510,
+	0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00E3, 0x00C3, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00A4,
+	0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250c, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580,
+	0x00D3, 0x00df, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00b5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4,
+	0x00AD, 0x00b1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00f7, 0x00B8, 0x00b0, 0x00A8, 0x00b7, 0x00B9, 0x00B3, 0x00b2, 0x25a0, 0x00a0};
+
+inline constexpr char32_t CharsetTableCP437[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+	0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+	0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
+	0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
+	0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
+	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
+	0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229,
+	0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0};
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_8bit(const Tsrcstring & str, const char32_t (&table)[256], mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		std::size_t c = static_cast<std::size_t>(mpt::char_value(str[i]));
+		if (c < std::size(table)) {
+			res.push_back(static_cast<mpt::widechar>(table[c]));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_8bit(const mpt::widestring & str, const char32_t (&table)[256], char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		bool found = false;
+		// Try non-control characters first.
+		// In cases where there are actual characters mirrored in this range (like in AMS/AMS2 character sets),
+		// characters in the common range are preferred this way.
+		for (std::size_t x = 0x20; x < std::size(table); ++x) {
+			if (c == table[x]) {
+				res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
+				found = true;
+				break;
+			}
+		}
+		if (!found) {
+			// try control characters
+			for (std::size_t x = 0x00; x < std::size(table) && x < 0x20; ++x) {
+				if (c == table[x]) {
+					res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
+					found = true;
+					break;
+				}
+			}
+		}
+		if (!found) {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_ascii(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		uint8 c = str[i];
+		if (c <= 0x7f) {
+			res.push_back(static_cast<mpt::widechar>(static_cast<uint32>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_ascii(const mpt::widestring & str, char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		if (c <= 0x7f) {
+			res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_iso8859_1(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	MPT_UNUSED(replacement);
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		uint8 c = str[i];
+		res.push_back(static_cast<mpt::widechar>(static_cast<uint32>(c)));
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_iso8859_1(const mpt::widestring & str, char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		if (c <= 0xff) {
+			res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_utf8(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	const Tsrcstring & in = str;
+	mpt::widestring out;
+	// state:
+	std::size_t charsleft = 0;
+	char32_t ucs4 = 0;
+	for (uint8 c : in) {
+		if (charsleft == 0) {
+			if ((c & 0x80) == 0x00) {
+				out.push_back(static_cast<mpt::widechar>(c));
+			} else if ((c & 0xE0) == 0xC0) {
+				ucs4 = c & 0x1F;
+				charsleft = 1;
+			} else if ((c & 0xF0) == 0xE0) {
+				ucs4 = c & 0x0F;
+				charsleft = 2;
+			} else if ((c & 0xF8) == 0xF0) {
+				ucs4 = c & 0x07;
+				charsleft = 3;
+			} else {
+				out.push_back(replacement);
+				ucs4 = 0;
+				charsleft = 0;
+			}
+		} else {
+			if ((c & 0xC0) != 0x80) {
+				out.push_back(replacement);
+				ucs4 = 0;
+				charsleft = 0;
+			}
+			ucs4 <<= 6;
+			ucs4 |= c & 0x3F;
+			charsleft--;
+			if (charsleft == 0) {
+				if constexpr (sizeof(mpt::widechar) == 2) {
+					if (ucs4 > 0x1fffff) {
+						out.push_back(replacement);
+						ucs4 = 0;
+						charsleft = 0;
+					}
+					if (ucs4 <= 0xffff) {
+						out.push_back(static_cast<mpt::widechar>(ucs4));
+					} else {
+						uint32 surrogate = static_cast<uint32>(ucs4) - 0x10000;
+						uint16 hi_sur = static_cast<uint16>((0x36 << 10) | ((surrogate >> 10) & ((1 << 10) - 1)));
+						uint16 lo_sur = static_cast<uint16>((0x37 << 10) | ((surrogate >> 0) & ((1 << 10) - 1)));
+						out.push_back(hi_sur);
+						out.push_back(lo_sur);
+					}
+				} else {
+					out.push_back(static_cast<mpt::widechar>(ucs4));
+				}
+				ucs4 = 0;
+			}
+		}
+	}
+	if (charsleft != 0) {
+		out.push_back(replacement);
+		ucs4 = 0;
+		charsleft = 0;
+	}
+	return out;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_utf8(const mpt::widestring & str, char replacement = '?') {
+	const mpt::widestring & in = str;
+	Tdststring out;
+	for (std::size_t i = 0; i < in.length(); i++) {
+		mpt::widechar wc = in[i];
+		char32_t ucs4 = 0;
+		if constexpr (sizeof(mpt::widechar) == 2) {
+			uint16 c = static_cast<uint16>(wc);
+			if (i + 1 < in.length()) {
+				// check for surrogate pair
+				uint16 hi_sur = in[i + 0];
+				uint16 lo_sur = in[i + 1];
+				if (hi_sur >> 10 == 0x36 && lo_sur >> 10 == 0x37) {
+					// surrogate pair
+					++i;
+					hi_sur &= (1 << 10) - 1;
+					lo_sur &= (1 << 10) - 1;
+					ucs4 = (static_cast<uint32>(hi_sur) << 10) | (static_cast<uint32>(lo_sur) << 0);
+				} else {
+					// no surrogate pair
+					ucs4 = static_cast<char32_t>(c);
+				}
+			} else {
+				// no surrogate possible
+				ucs4 = static_cast<char32_t>(c);
+			}
+		} else {
+			ucs4 = static_cast<char32_t>(wc);
+		}
+		if (ucs4 > 0x1fffff) {
+			out.push_back(replacement);
+			continue;
+		}
+		uint8 utf8[6];
+		std::size_t numchars = 0;
+		for (numchars = 0; numchars < 6; numchars++) {
+			utf8[numchars] = ucs4 & 0x3F;
+			ucs4 >>= 6;
+			if (ucs4 == 0) {
+				break;
+			}
+		}
+		numchars++;
+		if (numchars == 1) {
+			out.push_back(utf8[0]);
+			continue;
+		}
+		if (numchars == 2 && utf8[numchars - 1] == 0x01) {
+			// generate shortest form
+			out.push_back(utf8[0] | 0x40);
+			continue;
+		}
+		std::size_t charsleft = numchars;
+		while (charsleft > 0) {
+			if (charsleft == numchars) {
+				out.push_back(utf8[charsleft - 1] | (((1 << numchars) - 1) << (8 - numchars)));
+			} else {
+				// cppcheck false-positive
+				// cppcheck-suppress arrayIndexOutOfBounds
+				out.push_back(utf8[charsleft - 1] | 0x80);
+			}
+			charsleft--;
+		}
+	}
+	return out;
+}
+
+
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring utf32_from_utf16(const Tsrcstring & in, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == 2);
+	static_assert(sizeof(typename Tdststring::value_type) == 4);
+	MPT_UNUSED(replacement);
+	Tdststring out;
+	out.reserve(in.length());
+	for (std::size_t i = 0; i < in.length(); i++) {
+		char16_t wc = static_cast<char16_t>(static_cast<uint16>(in[i]));
+		char32_t ucs4 = 0;
+		uint16 c = static_cast<uint16>(wc);
+		if (i + 1 < in.length()) {
+			// check for surrogate pair
+			uint16 hi_sur = in[i + 0];
+			uint16 lo_sur = in[i + 1];
+			if (hi_sur >> 10 == 0x36 && lo_sur >> 10 == 0x37) {
+				// surrogate pair
+				++i;
+				hi_sur &= (1 << 10) - 1;
+				lo_sur &= (1 << 10) - 1;
+				ucs4 = (static_cast<uint32>(hi_sur) << 10) | (static_cast<uint32>(lo_sur) << 0);
+			} else {
+				// no surrogate pair
+				ucs4 = static_cast<char32_t>(c);
+			}
+		} else {
+			// no surrogate possible
+			ucs4 = static_cast<char32_t>(c);
+		}
+		out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint32>(ucs4)));
+	}
+	return out;
+}
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring utf16_from_utf32(const Tsrcstring & in, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == 4);
+	static_assert(sizeof(typename Tdststring::value_type) == 2);
+	Tdststring out;
+	out.reserve(in.length());
+	for (std::size_t i = 0; i < in.length(); i++) {
+		char32_t ucs4 = static_cast<char32_t>(static_cast<uint32>(in[i]));
+		if (ucs4 > 0x1fffff) {
+			out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint16>(replacement)));
+			ucs4 = 0;
+		}
+		if (ucs4 <= 0xffff) {
+			out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint16>(ucs4)));
+		} else {
+			uint32 surrogate = static_cast<uint32>(ucs4) - 0x10000;
+			uint16 hi_sur = static_cast<uint16>((0x36 << 10) | ((surrogate >> 10) & ((1 << 10) - 1)));
+			uint16 lo_sur = static_cast<uint16>((0x37 << 10) | ((surrogate >> 0) & ((1 << 10) - 1)));
+			out.push_back(static_cast<typename Tdststring::value_type>(hi_sur));
+			out.push_back(static_cast<typename Tdststring::value_type>(lo_sur));
+		}
+	}
+	return out;
+}
+
+
+
+#if MPT_OS_WINDOWS
+
+inline bool has_codepage(UINT cp) {
+	return IsValidCodePage(cp) ? true : false;
+}
+
+inline bool windows_has_encoding(common_encoding encoding) {
+	bool result = false;
+	switch (encoding) {
+		case common_encoding::utf8:
+			result = has_codepage(CP_UTF8);
+			break;
+		case common_encoding::ascii:
+			result = has_codepage(20127);
+			break;
+		case common_encoding::iso8859_1:
+			result = has_codepage(28591);
+			break;
+		case common_encoding::iso8859_15:
+			result = has_codepage(28605);
+			break;
+		case common_encoding::cp850:
+			result = has_codepage(850);
+			break;
+		case common_encoding::cp437:
+			result = has_codepage(437);
+			break;
+		case common_encoding::windows1252:
+			result = has_codepage(1252);
+			break;
+	}
+	return result;
+}
+
+inline bool windows_has_encoding(logical_encoding encoding) {
+	bool result = false;
+	switch (encoding) {
+		case logical_encoding::locale:
+			result = true;
+			break;
+		case logical_encoding::active_locale:
+			result = false;
+			break;
+	}
+	return result;
+}
+
+inline UINT codepage_from_encoding(logical_encoding encoding) {
+	UINT result = 0;
+	switch (encoding) {
+		case logical_encoding::locale:
+			result = CP_ACP;
+			break;
+		case logical_encoding::active_locale:
+			result = 0;
+			break;
+	}
+	return result;
+}
+
+inline UINT codepage_from_encoding(common_encoding encoding) {
+	UINT result = 0;
+	switch (encoding) {
+		case common_encoding::utf8:
+			result = CP_UTF8;
+			break;
+		case common_encoding::ascii:
+			result = 20127;
+			break;
+		case common_encoding::iso8859_1:
+			result = 28591;
+			break;
+		case common_encoding::iso8859_15:
+			result = 28605;
+			break;
+		case common_encoding::cp850:
+			result = 850;
+			break;
+		case common_encoding::cp437:
+			result = 437;
+			break;
+		case common_encoding::windows1252:
+			result = 1252;
+			break;
+	}
+	return result;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_codepage(UINT codepage, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	Tdststring encoded_string;
+	int required_size = WideCharToMultiByte(codepage, 0, src.data(), mpt::saturate_cast<int>(src.size()), nullptr, 0, nullptr, nullptr);
+	if (required_size > 0) {
+		encoded_string.resize(required_size);
+		WideCharToMultiByte(codepage, 0, src.data(), mpt::saturate_cast<int>(src.size()), reinterpret_cast<CHAR *>(encoded_string.data()), required_size, nullptr, nullptr);
+	}
+	return encoded_string;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_codepage(UINT codepage, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	mpt::widestring decoded_string;
+	int required_size = MultiByteToWideChar(codepage, 0, reinterpret_cast<const CHAR *>(src.data()), mpt::saturate_cast<int>(src.size()), nullptr, 0);
+	if (required_size > 0) {
+		decoded_string.resize(required_size);
+		MultiByteToWideChar(codepage, 0, reinterpret_cast<const CHAR *>(src.data()), mpt::saturate_cast<int>(src.size()), decoded_string.data(), required_size);
+	}
+	return decoded_string;
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_OS_DJGPP
+
+inline common_encoding djgpp_get_locale_encoding() {
+	uint16 active_codepage = 437;
+	uint16 system_codepage = 437;
+	__dpmi_regs regs;
+	std::memset(&regs, 0, sizeof(__dpmi_regs));
+	regs.x.ax = 0x6601;
+	if (__dpmi_int(0x21, &regs) == 0) {
+		int cf = (regs.x.flags >> 0) & 1;
+		if (cf == 0) {
+			active_codepage = regs.x.bx;
+			system_codepage = regs.x.dx;
+		}
+	}
+	common_encoding result = common_encoding::cp437;
+	if (active_codepage == 0) {
+		result = common_encoding::cp437;
+	} else if (active_codepage == 437) {
+		result = common_encoding::cp437;
+	} else if (active_codepage == 850) {
+		result = common_encoding::cp850;
+	} else if (system_codepage == 437) {
+		result = common_encoding::cp437;
+	} else if (system_codepage == 850) {
+		result = common_encoding::cp850;
+	} else {
+		result = common_encoding::cp437;
+	}
+	return result;
+}
+
+#endif // MPT_OS_DJGPP
+
+
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+
+// Note:
+//
+//  std::codecvt::out in LLVM libc++ does not advance in and out pointers when
+// running into a non-convertible character. This can happen when no locale is
+// set on FreeBSD or MacOSX. This behaviour violates the C++ standard.
+//
+//  We apply the following (albeit costly, even on other platforms) work-around:
+//  If the conversion errors out and does not advance the pointers at all, we
+// retry the conversion with a space character prepended to the string. If it
+// still does error out, we retry the whole conversion character by character.
+//  This is costly even on other platforms in one single case: The first
+// character is an invalid Unicode code point or otherwise not convertible. Any
+// following non-convertible characters are not a problem.
+
+inline std::wstring decode_locale_impl(const std::string & str, const std::locale & locale, wchar_t replacement = L'\uFFFD', int retry = 0, bool * progress = nullptr) {
+	if (str.empty()) {
+		return std::wstring();
+	}
+	std::vector<wchar_t> out;
+	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
+	std::mbstate_t state = std::mbstate_t();
+	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
+	codecvt_type::result result = codecvt_type::partial;
+	const char * in_begin = str.data();
+	const char * in_end = in_begin + str.size();
+	out.resize((in_end - in_begin) * (mpt::saturate_cast<std::size_t>(facet.max_length()) + 1));
+	wchar_t * out_begin = out.data();
+	wchar_t * out_end = out.data() + out.size();
+	const char * in_next = nullptr;
+	wchar_t * out_next = nullptr;
+	do {
+		if (retry == 2) {
+			for (;;) {
+				in_next = nullptr;
+				out_next = nullptr;
+				result = facet.in(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
+				if (result == codecvt_type::partial && in_next == in_begin + 1) {
+					in_begin = in_next;
+					out_begin = out_next;
+					continue;
+				} else {
+					break;
+				}
+			}
+		} else {
+			in_next = nullptr;
+			out_next = nullptr;
+			result = facet.in(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
+		}
+		if (result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end)) {
+			out.resize(out.size() * 2);
+			in_begin = in_next;
+			out_begin = out.data() + (out_next - out_begin);
+			out_end = out.data() + out.size();
+			continue;
+		}
+		if (retry == 0) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				bool made_progress = true;
+				decode_locale_impl(std::string(" ") + str, locale, replacement, 1, &made_progress);
+				if (!made_progress) {
+					return decode_locale_impl(str, locale, replacement, 2);
+				}
+			}
+		} else if (retry == 1) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				*progress = false;
+			} else {
+				*progress = true;
+			}
+			return std::wstring();
+		}
+		if (result == codecvt_type::error) {
+			++in_next;
+			*out_next = replacement;
+			++out_next;
+		}
+		in_begin = in_next;
+		out_begin = out_next;
+	} while ((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
+	return std::wstring(out.data(), out_next);
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_locale(const std::locale & locale, const Tsrcstring & src) {
+	if constexpr (std::is_same<Tsrcstring, std::string>::value) {
+		return decode_locale_impl(src, locale);
+	} else {
+		return decode_locale_impl(std::string(src.begin(), src.end()), locale);
+	}
+}
+
+inline std::string encode_locale_impl(const std::wstring & str, const std::locale & locale, char replacement = '?', int retry = 0, bool * progress = nullptr) {
+	if (str.empty()) {
+		return std::string();
+	}
+	std::vector<char> out;
+	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
+	std::mbstate_t state = std::mbstate_t();
+	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
+	codecvt_type::result result = codecvt_type::partial;
+	const wchar_t * in_begin = str.data();
+	const wchar_t * in_end = in_begin + str.size();
+	out.resize((in_end - in_begin) * (mpt::saturate_cast<std::size_t>(facet.max_length()) + 1));
+	char * out_begin = out.data();
+	char * out_end = out.data() + out.size();
+	const wchar_t * in_next = nullptr;
+	char * out_next = nullptr;
+	do {
+		if (retry == 2) {
+			for (;;) {
+				in_next = nullptr;
+				out_next = nullptr;
+				result = facet.out(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
+				if (result == codecvt_type::partial && in_next == in_begin + 1) {
+					in_begin = in_next;
+					out_begin = out_next;
+					continue;
+				} else {
+					break;
+				}
+			}
+		} else {
+			in_next = nullptr;
+			out_next = nullptr;
+			result = facet.out(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
+		}
+		if (result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end)) {
+			out.resize(out.size() * 2);
+			in_begin = in_next;
+			out_begin = out.data() + (out_next - out_begin);
+			out_end = out.data() + out.size();
+			continue;
+		}
+		if (retry == 0) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				bool made_progress = true;
+				encode_locale_impl(std::wstring(L" ") + str, locale, replacement, 1, &made_progress);
+				if (!made_progress) {
+					return encode_locale_impl(str, locale, replacement, 2);
+				}
+			}
+		} else if (retry == 1) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				*progress = false;
+			} else {
+				*progress = true;
+			}
+			return std::string();
+		}
+		if (result == codecvt_type::error) {
+			++in_next;
+			*out_next = replacement;
+			++out_next;
+		}
+		in_begin = in_next;
+		out_begin = out_next;
+	} while ((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
+	return std::string(out.data(), out_next);
+}
+
+template <typename Tdststring>
+inline Tdststring encode_locale(const std::locale & locale, const mpt::widestring & src) {
+	if constexpr (std::is_same<Tdststring, std::string>::value) {
+		return encode_locale_impl(src, locale);
+	} else {
+		const std::string tmp = encode_locale_impl(src, locale);
+		return Tdststring(tmp.begin(), tmp.end());
+	}
+}
+
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+
+#if MPT_OS_WINDOWS
+template <typename Tdststring>
+inline Tdststring encode(UINT codepage, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_codepage<Tdststring>(codepage, src);
+}
+#endif // MPT_OS_WINDOWS
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <typename Tdststring>
+inline Tdststring encode(const std::locale & locale, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_locale<Tdststring>(src, locale);
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+template <typename Tdststring>
+inline Tdststring encode(const char32_t (&table)[256], const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_8bit<Tdststring>(src, table);
+}
+
+template <typename Tdststring>
+inline Tdststring encode(common_encoding encoding, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return encode_codepage<Tdststring>(codepage_from_encoding(encoding), src);
+	}
+#endif
+	switch (encoding) {
+		case common_encoding::utf8:
+			return encode_utf8<Tdststring>(src);
+			break;
+		case common_encoding::ascii:
+			return encode_ascii<Tdststring>(src);
+			break;
+		case common_encoding::iso8859_1:
+			return encode_iso8859_1<Tdststring>(src);
+			break;
+		case common_encoding::iso8859_15:
+			return encode_8bit<Tdststring>(src, CharsetTableISO8859_15);
+			break;
+		case common_encoding::cp437:
+			return encode_8bit<Tdststring>(src, CharsetTableCP437);
+			break;
+		case common_encoding::cp850:
+			return encode_8bit<Tdststring>(src, CharsetTableCP850);
+			break;
+		case common_encoding::windows1252:
+			return encode_8bit<Tdststring>(src, CharsetTableWindows1252);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+}
+
+template <typename Tdststring>
+inline Tdststring encode(logical_encoding encoding, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return encode_codepage<Tdststring>(codepage_from_encoding(encoding), src);
+	}
+#endif
+#if MPT_OS_DJGPP
+	switch (encoding) {
+		case logical_encoding::locale:
+			return encode<Tdststring>(djgpp_get_locale_encoding(), src);
+			break;
+		case logical_encoding::active_locale:
+			return encode<Tdststring>(djgpp_get_locale_encoding(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#elif !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+	switch (encoding) {
+		case logical_encoding::locale:
+			return encode_locale<Tdststring>(std::locale(""), src);
+			break;
+		case logical_encoding::active_locale:
+			return encode_locale<Tdststring>(std::locale(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#else
+	throw std::domain_error("unsupported encoding");
+#endif
+}
+
+#if MPT_OS_WINDOWS
+template <typename Tsrcstring>
+inline mpt::widestring decode(UINT codepage, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_codepage(codepage, src);
+}
+#endif // MPT_OS_WINDOWS
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <typename Tsrcstring>
+inline mpt::widestring decode(const std::locale & locale, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_locale(src, locale);
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(const char32_t (&table)[256], const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_8bit(src, table);
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(common_encoding encoding, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return decode_codepage(codepage_from_encoding(encoding), src);
+	}
+#endif
+	switch (encoding) {
+		case common_encoding::utf8:
+			return decode_utf8(src);
+			break;
+		case common_encoding::ascii:
+			return decode_ascii(src);
+			break;
+		case common_encoding::iso8859_1:
+			return decode_iso8859_1(src);
+			break;
+		case common_encoding::iso8859_15:
+			return decode_8bit(src, CharsetTableISO8859_15);
+			break;
+		case common_encoding::cp437:
+			return decode_8bit(src, CharsetTableCP437);
+			break;
+		case common_encoding::cp850:
+			return decode_8bit(src, CharsetTableCP850);
+			break;
+		case common_encoding::windows1252:
+			return decode_8bit(src, CharsetTableWindows1252);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(logical_encoding encoding, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return decode_codepage(codepage_from_encoding(encoding), src);
+	}
+#endif
+#if MPT_OS_DJGPP
+	switch (encoding) {
+		case logical_encoding::locale:
+			return decode(djgpp_get_locale_encoding(), src);
+			break;
+		case logical_encoding::active_locale:
+			return decode(djgpp_get_locale_encoding(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#elif !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+	switch (encoding) {
+		case logical_encoding::locale:
+			return decode_locale(std::locale(""), src);
+			break;
+		case logical_encoding::active_locale:
+			return decode_locale(std::locale(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#else
+	throw std::domain_error("unsupported encoding");
+#endif
+}
+
+
+
+inline bool is_utf8(const std::string & str) {
+	return (str == encode<std::string>(common_encoding::utf8, decode<std::string>(common_encoding::utf8, str)));
+}
+
+
+
+template <typename Tstring>
+struct string_converter {
+};
+
+template <logical_encoding encoding>
+struct string_converter<std::basic_string<char, logical_encoding_char_traits<encoding>>> {
+	using string_type = std::basic_string<char, logical_encoding_char_traits<encoding>>;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(encoding, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(encoding, src);
+	}
+};
+
+template <common_encoding encoding>
+struct string_converter<std::basic_string<char, common_encoding_char_traits<encoding>>> {
+	using string_type = std::basic_string<char, common_encoding_char_traits<encoding>>;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(encoding, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(encoding, src);
+	}
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct string_converter<std::wstring> {
+	using string_type = std::wstring;
+	static inline mpt::widestring decode(const string_type & src) {
+		return src;
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src;
+	}
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct string_converter<std::u8string> {
+	using string_type = std::u8string;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(common_encoding::utf8, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(common_encoding::utf8, src);
+	}
+};
+#endif // C++10
+
+template <>
+struct string_converter<std::u16string> {
+	using string_type = std::u16string;
+	static inline mpt::widestring decode(const string_type & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char16_t)) {
+			return mpt::widestring(src.begin(), src.end());
+		} else {
+			return utf32_from_utf16<mpt::widestring, std::u16string>(src);
+		}
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char16_t)) {
+			return string_type(src.begin(), src.end());
+		} else {
+			return utf16_from_utf32<std::u16string, mpt::widestring>(src);
+		}
+	}
+};
+
+#if defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct string_converter<std::u32string> {
+	using string_type = std::u32string;
+	static inline mpt::widestring decode(const string_type & src) {
+		return src;
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src;
+	}
+};
+#else  // !MPT_COMPILER_QUIRK_NO_WCHAR
+template <>
+struct string_converter<std::u32string> {
+	using string_type = std::u32string;
+	static inline mpt::widestring decode(const string_type & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char32_t)) {
+			return mpt::widestring(src.begin(), src.end());
+		} else {
+			return utf16_from_utf32<mpt::widestring, std::u32string>(src);
+		}
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char32_t)) {
+			return string_type(src.begin(), src.end());
+		} else {
+			return utf32_from_utf16<std::u32string, mpt::widestring>(src);
+		}
+	}
+};
+#endif // MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct string_converter<CStringW> {
+	using string_type = CStringW;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::widestring(src.GetString());
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src.c_str();
+	}
+};
+
+template <>
+struct string_converter<CStringA> {
+	using string_type = CStringA;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<std::string>(mpt::logical_encoding::locale, std::string(src.GetString()));
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<std::string>(mpt::logical_encoding::locale, src).c_str();
+	}
+};
+
+#endif // MPT_DETECTED_MFC
+
+template <typename Tdststring, typename Tsrcstring, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(const Tsrcstring & src) {
+	if constexpr (std::is_same<Tdststring, typename mpt::make_string_type<Tsrcstring>::type>::value) {
+		return mpt::as_string(src);
+	} else {
+		return string_converter<Tdststring>::encode(string_converter<decltype(mpt::as_string(src))>::decode(mpt::as_string(src)));
+	}
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tencoding, std::enable_if_t<std::is_same<Tdststring, std::string>::value, bool> = true, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tencoding to, const Tsrcstring & src) {
+	return mpt::encode<Tdststring>(to, string_converter<decltype(mpt::as_string(src))>::decode(mpt::as_string(src)));
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tencoding, std::enable_if_t<std::is_same<typename mpt::make_string_type<Tsrcstring>::type, std::string>::value, bool> = true, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tencoding from, const Tsrcstring & src) {
+	return string_converter<Tdststring>::encode(mpt::decode<decltype(mpt::as_string(src))>(from, mpt::as_string(src)));
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tto, typename Tfrom, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tto to, Tfrom from, const Tsrcstring & src) {
+	return mpt::encode<Tdststring>(to, mpt::decode<decltype(mpt::as_string(src))>(from, mpt::as_string(src)));
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_CONVERT_HPP

Property changes on: src/mpt/string/convert.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/convert_macros.hpp
===================================================================
--- src/mpt/string/convert_macros.hpp	(nonexistent)
+++ src/mpt/string/convert_macros.hpp	(working copy)
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_CONVERT_MACROS_HPP
+#define MPT_STRING_CONVERT_MACROS_HPP
+
+
+
+#include "mpt/string/types.hpp"
+#include "mpt/string/convert.hpp"
+
+#include <string>
+
+
+
+// The MPT_UTF8_STRING allows specifying UTF8 char arrays.
+// The resulting type is mpt::ustring and the construction might require runtime translation,
+// i.e. it is NOT generally available at compile time.
+// Use explicit UTF8 encoding,
+// i.e. U+00FC (LATIN SMALL LETTER U WITH DIAERESIS) would be written as "\xC3\xBC".
+#define MPT_UTF8_STRING(x) mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, std::string{x})
+
+
+
+#endif // MPT_STRING_CONVERT_MACROS_HPP

Property changes on: src/mpt/string/convert_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_floatingpoint.hpp
===================================================================
--- src/mpt/string/format_default_floatingpoint.hpp	(nonexistent)
+++ src/mpt/string/format_default_floatingpoint.hpp	(working copy)
@@ -0,0 +1,91 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP
+#define MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+
+#if MPT_MSVC_AT_LEAST(2019, 4) || MPT_GCC_AT_LEAST(11, 1, 0)
+#define MPT_FORMAT_CXX17_FLOAT 1
+#else
+#define MPT_FORMAT_CXX17_FLOAT 0
+#endif
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include "mpt/base/algorithm.hpp"
+#endif
+#include "mpt/string/convert.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include <charconv>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <iomanip>
+#include <ios>
+#include <limits>
+#include <locale>
+#include <sstream>
+#endif
+#include <string>
+#if MPT_FORMAT_CXX17_FLOAT
+#include <system_error>
+#endif
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_FORMAT_CXX17_FLOAT
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring to_chars_string(const T & x) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_chars_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+#endif
+
+
+#if !MPT_FORMAT_CXX17_FLOAT
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring to_stream_string(const T & x) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	s << std::setprecision(std::numeric_limits<T>::max_digits10) << x;
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_stream_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+#endif
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP

Property changes on: src/mpt/string/format_default_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_formatter.hpp
===================================================================
--- src/mpt/string/format_default_formatter.hpp	(nonexistent)
+++ src/mpt/string/format_default_formatter.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP
+#define MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_default_floatingpoint.hpp"
+#include "mpt/string/format_default_integer.hpp"
+#include "mpt/string/format_default_string.hpp"
+
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+struct default_formatter {
+	template <typename Tstring, typename T>
+	static inline Tstring format(const T & value) {
+		using namespace mpt;
+		return format_value_default<Tstring>(value);
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP

Property changes on: src/mpt/string/format_default_formatter.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_integer.hpp
===================================================================
--- src/mpt/string/format_default_integer.hpp	(nonexistent)
+++ src/mpt/string/format_default_integer.hpp	(working copy)
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP
+#define MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP
+
+
+#include "mpt/base/detect.hpp"
+
+#if 1
+#define MPT_FORMAT_CXX17_INT 1
+#else
+#define MPT_FORMAT_CXX17_INT 0
+#endif
+
+#if MPT_FORMAT_CXX17_INT
+#include "mpt/base/algorithm.hpp"
+#endif // MPT_FORMAT_CXX17_INT
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/format_helpers.hpp"
+
+#if MPT_FORMAT_CXX17_INT
+#include <charconv>
+#endif // MPT_FORMAT_CXX17_INT
+#if !MPT_FORMAT_CXX17_INT
+#include <ios>
+#include <locale>
+#include <sstream>
+#endif // !MPT_FORMAT_CXX17_INT
+#include <string>
+#if MPT_FORMAT_CXX17_INT
+#include <system_error>
+#endif // MPT_FORMAT_CXX17_INT
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_FORMAT_CXX17_INT
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring to_chars_string(const T & x) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		if constexpr (std::is_same<T, bool>::value) {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), static_cast<int>(x));
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		} else {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_chars_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+
+#endif // MPT_FORMAT_CXX17_INT
+
+
+#if !MPT_FORMAT_CXX17_INT
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring to_stream_string(const T & x) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	if constexpr (std::is_same<T, bool>::value) {
+		s << static_cast<int>(x);
+	} else if constexpr (mpt::is_character<T>::value) {
+		s << (x + 0); // force integral promotion
+	} else {
+		s << x;
+	}
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_stream_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+
+#endif // !MPT_FORMAT_CXX17_INT
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP

Property changes on: src/mpt/string/format_default_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_string.hpp
===================================================================
--- src/mpt/string/format_default_string.hpp	(nonexistent)
+++ src/mpt/string/format_default_string.hpp	(working copy)
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_STRING_HPP
+#define MPT_STRING_FORMAT_DEFAULT_STRING_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tstring, typename T>
+inline auto format_value_default(const T & x) -> decltype(mpt::convert<Tstring>(x)) {
+	return mpt::convert<Tstring>(x);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_STRING_HPP

Property changes on: src/mpt/string/format_default_string.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_helpers.hpp
===================================================================
--- src/mpt/string/format_helpers.hpp	(nonexistent)
+++ src/mpt/string/format_helpers.hpp	(working copy)
@@ -0,0 +1,106 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_HELPERS_HPP
+#define MPT_STRING_FORMAT_HELPERS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <string>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring convert_formatted_simple(const Tsrcstring & src) {
+	if constexpr (std::is_same<Tdststring, Tsrcstring>::value) {
+		return src;
+	} else {
+		Tdststring dst;
+		dst.reserve(src.length());
+		for (std::size_t i = 0; i < src.length(); ++i) {
+			dst.push_back(mpt::unsafe_char_convert<typename Tdststring::value_type>(src[i]));
+		}
+		return dst;
+	}
+}
+
+
+template <typename Tchar>
+struct select_format_char_type {
+	using type = char;
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct select_format_char_type<wchar_t> {
+	using type = wchar_t;
+};
+#if MPT_USTRING_MODE_WIDE
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct select_format_char_type<char8_t> {
+	using type = wchar_t;
+};
+#endif // C++20
+template <>
+struct select_format_char_type<char16_t> {
+	using type = wchar_t;
+};
+template <>
+struct select_format_char_type<char32_t> {
+	using type = wchar_t;
+};
+#endif // MPT_USTRING_MODE_WIDE
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+template <typename Tstring>
+struct select_format_string_type {
+	using type = mpt::ustring;
+};
+
+template <>
+struct select_format_string_type<std::string> {
+	using type = std::string;
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct select_format_string_type<std::wstring> {
+	using type = std::wstring;
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct select_format_string_type<std::u8string> {
+	using type = std::u8string;
+};
+#endif // C++20
+
+template <>
+struct select_format_string_type<std::u16string> {
+	using type = std::u16string;
+};
+
+template <>
+struct select_format_string_type<std::u32string> {
+	using type = std::u32string;
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_HELPERS_HPP

Property changes on: src/mpt/string/format_helpers.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_message.hpp
===================================================================
--- src/mpt/string/format_message.hpp	(nonexistent)
+++ src/mpt/string/format_message.hpp	(working copy)
@@ -0,0 +1,334 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_MESSAGE_HPP
+#define MPT_STRING_FORMAT_MESSAGE_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <utility>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class format_message_syntax_error
+	: public std::domain_error {
+public:
+	format_message_syntax_error()
+		: std::domain_error("format string syntax error") {
+		return;
+	}
+};
+
+template <typename Tformatter, typename Tformat>
+class message_formatter {
+
+public:
+	using Tstring = typename mpt::make_string_type<Tformat>::type;
+
+private:
+	Tstring format;
+
+private:
+	MPT_NOINLINE Tstring do_format(const mpt::span<const Tstring> vals) const {
+		using traits = typename mpt::string_traits<Tstring>;
+		using char_type = typename traits::char_type;
+		using size_type = typename traits::size_type;
+		Tstring result;
+		const size_type len = traits::length(format);
+		traits::reserve(result, len);
+		std::size_t max_arg = 0;
+		std::size_t args = 0;
+		bool success = true;
+		enum class state : int
+		{
+			error = -1,
+			text = 0,
+			open_seen = 1,
+			number_seen = 2,
+			close_seen = 3,
+		};
+		state state = state::text;
+		bool numbered_args = false;
+		bool unnumbered_args = false;
+		std::size_t last_arg = 0;
+		std::size_t this_arg = 0;
+		std::size_t current_arg = 0;
+		for (size_type pos = 0; pos != len; ++pos) {
+			char_type c = format[pos];
+			switch (state) {
+				case state::text:
+					if (c == char_type('{')) {
+						state = state::open_seen;
+					} else if (c == char_type('}')) {
+						state = state::close_seen;
+					} else {
+						state = state::text;
+						traits::append(result, 1, c); // output c here
+					}
+					break;
+				case state::open_seen:
+					if (c == char_type('{')) {
+						state = state::text;
+						traits::append(result, 1, char_type('{')); // output { here
+					} else if (c == char_type('}')) {
+						state = state::text;
+						unnumbered_args = true;
+						last_arg++;
+						this_arg = last_arg;
+						{ // output this_arg here
+							const std::size_t n = this_arg - 1;
+							if (n < std::size(vals)) {
+								traits::append(result, vals[n]);
+							}
+						}
+						if (this_arg > max_arg) {
+							max_arg = this_arg;
+						}
+						args += 1;
+					} else if (char_type('0') <= c && c <= char_type('9')) {
+						state = state::number_seen;
+						numbered_args = true;
+						current_arg = c - char_type('0');
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::number_seen:
+					if (c == char_type('{')) {
+						state = state::error;
+					} else if (c == char_type('}')) {
+						state = state::text;
+						this_arg = current_arg + 1;
+						{ // output this_arg here
+							const std::size_t n = this_arg - 1;
+							if (n < std::size(vals)) {
+								traits::append(result, vals[n]);
+							}
+						}
+						if (this_arg > max_arg) {
+							max_arg = this_arg;
+						}
+						args += 1;
+					} else if (char_type('0') <= c && c <= char_type('9')) {
+						state = state::number_seen;
+						numbered_args = true;
+						current_arg = (current_arg * 10) + (c - char_type('0'));
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::close_seen:
+					if (c == char_type('{')) {
+						state = state::error;
+					} else if (c == char_type('}')) {
+						state = state::text;
+						traits::append(result, 1, char_type('}')); // output } here
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::error:
+					state = state::error;
+					break;
+			}
+		}
+		if (state == state::error) {
+			success = false;
+		}
+		if (state != state::text) {
+			success = false;
+		}
+		if (numbered_args && unnumbered_args) {
+			success = false;
+		}
+		if (!success) {
+			throw format_message_syntax_error();
+		}
+		return result;
+	}
+
+public:
+	MPT_FORCEINLINE message_formatter(Tstring format_)
+		: format(std::move(format_)) {
+	}
+
+public:
+	template <typename... Ts>
+	MPT_NOINLINE Tstring operator()(Ts &&... xs) const {
+		const std::array<Tstring, sizeof...(xs)> vals{{Tformatter::template format<Tstring>(std::forward<Ts>(xs))...}};
+		return do_format(mpt::as_span(vals));
+	}
+
+}; // struct message_formatter<Tformat>
+
+
+template <typename Tformatter, std::ptrdiff_t N, typename Tchar, typename Tstring>
+class message_formatter_counted {
+
+private:
+	message_formatter<Tformatter, Tstring> formatter;
+
+public:
+	template <std::size_t literal_length>
+	inline message_formatter_counted(const Tchar (&format)[literal_length])
+		: formatter(Tstring(format)) {
+		return;
+	}
+
+public:
+	template <typename... Ts>
+	inline Tstring operator()(Ts &&... xs) const {
+		static_assert(static_cast<std::ptrdiff_t>(sizeof...(xs)) == N);
+		return formatter(std::forward<Ts>(xs)...);
+	}
+
+}; // struct message_formatter_counted<Tformat>
+
+
+template <typename Tchar>
+MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count_impl(const Tchar * const format, const std::size_t len) {
+	std::size_t max_arg = 0;
+	std::size_t args = 0;
+	bool success = true;
+	enum class state : int
+	{
+		error = -1,
+		text = 0,
+		open_seen = 1,
+		number_seen = 2,
+		close_seen = 3,
+	};
+	state state = state::text;
+	bool numbered_args = false;
+	bool unnumbered_args = false;
+	std::size_t last_arg = 0;
+	std::size_t this_arg = 0;
+	std::size_t current_arg = 0;
+	for (std::size_t pos = 0; pos != len; ++pos) {
+		Tchar c = format[pos];
+		switch (state) {
+			case state::text:
+				if (c == Tchar('{')) {
+					state = state::open_seen;
+				} else if (c == Tchar('}')) {
+					state = state::close_seen;
+				} else {
+					state = state::text;
+					// output c here
+				}
+				break;
+			case state::open_seen:
+				if (c == Tchar('{')) {
+					state = state::text;
+					// output { here
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					unnumbered_args = true;
+					last_arg++;
+					this_arg = last_arg;
+					// output this_arg here
+					if (this_arg > max_arg)
+					{
+						max_arg = this_arg;
+					}
+					args += 1;
+				} else if (Tchar('0') <= c && c <= Tchar('9')) {
+					state = state::number_seen;
+					numbered_args = true;
+					current_arg = c - Tchar('0');
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::number_seen:
+				if (c == Tchar('{')) {
+					state = state::error;
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					this_arg = current_arg + 1;
+					// output this_arg here
+					if (this_arg > max_arg) {
+						max_arg = this_arg;
+					}
+					args += 1;
+				} else if (Tchar('0') <= c && c <= Tchar('9')) {
+					state = state::number_seen;
+					numbered_args = true;
+					current_arg = (current_arg * 10) + (c - Tchar('0'));
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::close_seen:
+				if (c == Tchar('{')) {
+					state = state::error;
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					// output } here
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::error:
+				state = state::error;
+				break;
+		}
+	}
+	if (state == state::error) {
+		success = false;
+	}
+	if (state != state::text) {
+		success = false;
+	}
+	if (numbered_args && unnumbered_args) {
+		success = false;
+	}
+	if (!success) {
+		throw format_message_syntax_error();
+	}
+	if (max_arg != args) {
+		throw format_message_syntax_error();
+	}
+	return max_arg;
+}
+
+
+template <typename Tchar, std::size_t literal_length>
+MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count(const Tchar (&format)[literal_length]) {
+	return parse_format_string_argument_count_impl(format, literal_length - 1);
+}
+
+
+template <typename Tformatter, std::size_t args, typename Tchar, std::size_t N>
+inline auto format_message(const Tchar (&format)[N]) {
+	using Tstring = typename mpt::make_string_type<const Tchar *>::type;
+	return message_formatter_counted<Tformatter, args, Tchar, Tstring>(format);
+}
+
+template <typename Tformatter, std::size_t args, typename Tstring, typename Tchar, std::size_t N>
+inline auto format_message_typed(const Tchar (&format)[N]) {
+	return message_formatter_counted<Tformatter, args, Tchar, Tstring>(format);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_MESSAGE_HPP

Property changes on: src/mpt/string/format_message.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_message_macros.hpp
===================================================================
--- src/mpt/string/format_message_macros.hpp	(nonexistent)
+++ src/mpt/string/format_message_macros.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_MESSAGE_MACROS_HPP
+#define MPT_STRING_FORMAT_MESSAGE_MACROS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/format_default_formatter.hpp"
+#include "mpt/string/format_message.hpp"
+
+
+
+#define MPT_FORMAT_MESSAGE(f) mpt::format_message<mpt::default_formatter, mpt::parse_format_string_argument_count(f)>(f)
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#define MPT_WFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(L##f), std::wstring>(L##f)
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#define MPT_UFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(MPT_ULITERAL(f)), mpt::ustring>(MPT_ULITERAL(f))
+
+#define MPT_LFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(f), mpt::lstring>(f)
+
+#if MPT_OS_WINDOWS
+#define MPT_TFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(TEXT(f)), mpt::tstring>(TEXT(f))
+#endif
+
+#if MPT_DETECTED_MFC
+#define MPT_CWFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(L##f), CStringW>(L##f)
+#define MPT_CAFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(f), CStringA>(f)
+#define MPT_CFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(TEXT(f)), CString>(TEXT(f))
+#endif // MPT_DETECTED_MFC
+
+
+
+#endif // MPT_STRING_FORMAT_MESSAGE_MACROS_HPP

Property changes on: src/mpt/string/format_message_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple.hpp
===================================================================
--- src/mpt/string/format_simple.hpp	(nonexistent)
+++ src/mpt/string/format_simple.hpp	(working copy)
@@ -0,0 +1,166 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_HPP
+#define MPT_STRING_FORMAT_SIMPLE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/pointer.hpp"
+#include "mpt/string/format_default_formatter.hpp"
+#include "mpt/string/format_simple_floatingpoint.hpp"
+#include "mpt/string/format_simple_integer.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename Tstring>
+struct format : format_simple_base {
+
+	template <typename T>
+	static inline Tstring val(const T & x) {
+		return mpt::default_formatter::format<Tstring>(x);
+	}
+
+	template <typename T>
+	static inline Tstring fmt(const T & x, const format_simple_spec & f) {
+		return mpt::format_simple<Tstring>(x, f);
+	}
+
+	template <typename T>
+	static inline Tstring dec(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillOff());
+	}
+	template <int width, typename T>
+	static inline Tstring dec0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillNul().Width(width));
+	}
+
+	template <typename T>
+	static inline Tstring dec(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillOff().Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring dec0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+
+	template <typename T>
+	static inline Tstring hex(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillOff());
+	}
+	template <typename T>
+	static inline Tstring HEX(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillOff());
+	}
+	template <int width, typename T>
+	static inline Tstring hex0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillNul().Width(width));
+	}
+	template <int width, typename T>
+	static inline Tstring HEX0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillNul().Width(width));
+	}
+
+	template <typename T>
+	static inline Tstring hex(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillOff().Group(g).GroupSep(s));
+	}
+	template <typename T>
+	static inline Tstring HEX(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillOff().Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring hex0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring HEX0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+
+	template <typename T>
+	static inline Tstring flt(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaNrm().FillOff().Precision(precision));
+	}
+	template <typename T>
+	static inline Tstring fix(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaFix().FillOff().Precision(precision));
+	}
+	template <typename T>
+	static inline Tstring sci(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaSci().FillOff().Precision(precision));
+	}
+
+	template <typename T>
+	static inline Tstring ptr(const T & x) {
+		static_assert(std::is_pointer<T>::value || std::is_same<T, std::uintptr_t>::value || std::is_same<T, std::intptr_t>::value, "");
+		return hex0<mpt::pointer_size * 2>(mpt::pointer_cast<const std::uintptr_t>(x));
+	}
+	template <typename T>
+	static inline Tstring PTR(const T & x) {
+		static_assert(std::is_pointer<T>::value || std::is_same<T, std::uintptr_t>::value || std::is_same<T, std::intptr_t>::value, "");
+		return HEX0<mpt::pointer_size * 2>(mpt::pointer_cast<const std::uintptr_t>(x));
+	}
+
+	static inline Tstring pad_left(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return traits::pad(str, width, 0);
+	}
+	static inline Tstring pad_right(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return traits::pad(str, 0, width);
+	}
+	static inline Tstring left(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, 0, width - traits::length(str)) : str;
+	}
+	static inline Tstring right(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, width - traits::length(str), 0) : str;
+	}
+	static inline Tstring center(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, (width - traits::length(str)) / 2, (width - traits::length(str) + 1) / 2) : str;
+	}
+
+}; // struct format
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_HPP

Property changes on: src/mpt/string/format_simple.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_floatingpoint.hpp
===================================================================
--- src/mpt/string/format_simple_floatingpoint.hpp	(nonexistent)
+++ src/mpt/string/format_simple_floatingpoint.hpp	(working copy)
@@ -0,0 +1,242 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP
+#define MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/string/format_default_floatingpoint.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include "mpt/base/algorithm.hpp"
+#endif
+#include "mpt/string/convert.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include <charconv>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <iomanip>
+#include <ios>
+#endif
+#if MPT_FORMAT_CXX17_FLOAT
+#include <iterator>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <limits>
+#include <locale>
+#include <sstream>
+#endif
+#include <string>
+#if MPT_FORMAT_CXX17_FLOAT
+#include <system_error>
+#endif
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_FORMAT_CXX17_FLOAT
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_to_chars(const T & x, std::chars_format fmt) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, fmt);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_to_chars(const T & x, std::chars_format fmt, int precision) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, fmt, precision);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring>
+inline Tstring format_simple_floatingpoint_postprocess_width(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	if (f & format_simple_base::FillNul) {
+		auto pos = str.begin();
+		if (str.length() > 0) {
+			if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+')) {
+				pos++;
+				width++;
+			} else if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')) {
+				pos++;
+				width++;
+			}
+		}
+		if (str.length() - std::distance(str.begin(), pos) < width) {
+			str.insert(pos, width - str.length() - std::distance(str.begin(), pos), '0');
+		}
+	} else {
+		if (str.length() < width) {
+			str.insert(0, width - str.length(), ' ');
+		}
+	}
+	return str;
+}
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & f) {
+	using format_string_type = typename mpt::select_format_string_type<Tstring>::type;
+	if (f.GetPrecision() != -1) {
+		if (f.GetFlags() & format_simple_base::NotaSci) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::scientific, f.GetPrecision()), f));
+		} else if (f.GetFlags() & format_simple_base::NotaFix) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::fixed, f.GetPrecision()), f));
+		} else {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::general, f.GetPrecision()), f));
+		}
+	} else {
+		if (f.GetFlags() & format_simple_base::NotaSci) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::scientific), f));
+		} else if (f.GetFlags() & format_simple_base::NotaFix) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::fixed), f));
+		} else {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::general), f));
+		}
+	}
+}
+
+
+#else // !MPT_FORMAT_CXX17_FLOAT
+
+
+template <typename Tchar>
+struct NumPunct : std::numpunct<Tchar> {
+private:
+	unsigned int group;
+	char sep;
+
+public:
+	NumPunct(unsigned int g, char s)
+		: group(g)
+		, sep(s) { }
+	std::string do_grouping() const override {
+		return std::string(1, static_cast<char>(group));
+	}
+	Tchar do_thousands_sep() const override {
+		return static_cast<Tchar>(sep);
+	}
+};
+
+template <typename Tostream, typename T>
+inline void format_simple_floatingpoint_apply_stream_format(Tostream & o, const format_simple_spec & format, const T &) {
+	if (format.GetGroup() > 0)
+	{
+		o.imbue(std::locale(o.getloc(), new NumPunct<typename Tostream::char_type>(format.GetGroup(), format.GetGroupSep())));
+	}
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	int precision = format.GetPrecision();
+	if (precision != -1 && width != 0 && !(f & format_simple_base::NotaFix) && !(f & format_simple_base::NotaSci))
+	{
+		// fixup:
+		// precision behaves differently from .#
+		// avoid default format when precision and width are set
+		f &= ~format_simple_base::NotaNrm;
+		f |= format_simple_base::NotaFix;
+	}
+	if (f & format_simple_base::BaseDec) {
+		o << std::dec;
+	} else if (f & format_simple_base::BaseHex) {
+		o << std::hex;
+	}
+	if (f & format_simple_base::NotaNrm) { /*nothing*/
+	} else if (f & format_simple_base::NotaFix) {
+		o << std::setiosflags(std::ios::fixed);
+	} else if (f & format_simple_base::NotaSci) {
+		o << std::setiosflags(std::ios::scientific);
+	}
+	if (f & format_simple_base::CaseLow) {
+		o << std::nouppercase;
+	} else if (f & format_simple_base::CaseUpp) {
+		o << std::uppercase;
+	}
+	if (f & format_simple_base::FillOff) { /* nothing */
+	} else if (f & format_simple_base::FillNul) {
+		o << std::setw(width) << std::setfill(typename Tostream::char_type('0'));
+	}
+	if (precision != -1)
+	{
+		o << std::setprecision(precision);
+	} else
+	{
+		if constexpr (std::is_floating_point<T>::value)
+		{
+			if (f & format_simple_base::NotaNrm)
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10);
+			} else if (f & format_simple_base::NotaFix)
+			{
+				o << std::setprecision(std::numeric_limits<T>::digits10);
+			} else if (f & format_simple_base::NotaSci)
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10 - 1);
+			} else
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10);
+			}
+		}
+	}
+}
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_stream(const T & x, const format_simple_spec & f) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	mpt::format_simple_floatingpoint_apply_stream_format(s, f, x);
+	s << x;
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & format) {
+	return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_stream<typename mpt::select_format_string_type<Tstring>::type>(x, format));
+}
+
+
+
+#endif // MPT_FORMAT_CXX17_FLOAT
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP

Property changes on: src/mpt/string/format_simple_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_integer.hpp
===================================================================
--- src/mpt/string/format_simple_integer.hpp	(nonexistent)
+++ src/mpt/string/format_simple_integer.hpp	(working copy)
@@ -0,0 +1,134 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP
+#define MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP
+
+
+#include "mpt/base/algorithm.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+
+#include <charconv>
+#include <string>
+#include <system_error>
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_simple_integer_to_chars(const T & x, int base) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		if constexpr (std::is_same<T, bool>::value) {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), static_cast<int>(x), base);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		} else {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, base);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_case(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	if (f & format_simple_base::CaseUpp) {
+		for (auto & c : str) {
+			if (mpt::unsafe_char_convert<typename Tstring::value_type>('a') <= c && c <= mpt::unsafe_char_convert<typename Tstring::value_type>('z')) {
+				c -= mpt::unsafe_char_convert<typename Tstring::value_type>('a') - mpt::unsafe_char_convert<typename Tstring::value_type>('A');
+			}
+		}
+	}
+	return str;
+}
+
+
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_digits(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	if (f & format_simple_base::FillNul) {
+		auto pos = str.begin();
+		if (str.length() > 0) {
+			if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+')) {
+				pos++;
+				width++;
+			} else if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')) {
+				pos++;
+				width++;
+			}
+		}
+		if (str.length() < width) {
+			str.insert(pos, width - str.length(), mpt::unsafe_char_convert<typename Tstring::value_type>('0'));
+		}
+	}
+	return str;
+}
+
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4723) // potential divide by 0
+#endif                          // MPT_COMPILER_MSVC
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_group(Tstring str, const format_simple_spec & format) {
+	if (format.GetGroup() > 0) {
+		const unsigned int groupSize = format.GetGroup();
+		const char groupSep = format.GetGroupSep();
+		std::size_t len = str.length();
+		for (std::size_t n = 0; n < len; ++n) {
+			if (n > 0 && (n % groupSize) == 0) {
+				if (!(n == (len - 1) && (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+') || str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')))) {
+					str.insert(str.begin() + (len - n), 1, mpt::unsafe_char_convert<typename Tstring::value_type>(groupSep));
+				}
+			}
+		}
+	}
+	return str;
+}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & format) {
+	int base = 10;
+	if (format.GetFlags() & format_simple_base::BaseDec) {
+		base = 10;
+	}
+	if (format.GetFlags() & format_simple_base::BaseHex) {
+		base = 16;
+	}
+	using format_string_type = typename mpt::select_format_string_type<Tstring>::type;
+	return mpt::convert<Tstring>(mpt::format_simple_integer_postprocess_group(mpt::format_simple_integer_postprocess_digits(mpt::format_simple_integer_postprocess_case(mpt::format_simple_integer_to_chars<format_string_type>(x, base), format), format), format));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP

Property changes on: src/mpt/string/format_simple_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_spec.hpp
===================================================================
--- src/mpt/string/format_simple_spec.hpp	(nonexistent)
+++ src/mpt/string/format_simple_spec.hpp	(working copy)
@@ -0,0 +1,218 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_SPEC_HPP
+#define MPT_STRING_FORMAT_SIMPLE_SPEC_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+struct format_simple_base {
+
+	enum FormatFlagsEnum
+	{
+		BaseDec = 0x0001, // base 10 (integers only)        // int+float
+		BaseHex = 0x0002, // base 16 (integers only)        // int+float
+		CaseLow = 0x0010, // lower case hex digits          // int+float
+		CaseUpp = 0x0020, // upper case hex digits          // int+float
+		FillOff = 0x0100, // do not fill up width           // int+float
+		FillNul = 0x0400, // fill up width with zeros       // int+float
+		NotaNrm = 0x1000, // float: normal/default notation // float
+		NotaFix = 0x2000, // float: fixed point notation    // float
+		NotaSci = 0x4000, // float: scientific notation     // float
+	};
+
+}; // struct format_simple_base
+
+using format_simple_flags = unsigned int;
+
+static_assert(sizeof(format_simple_flags) >= sizeof(format_simple_base::FormatFlagsEnum));
+
+
+class format_simple_spec {
+private:
+	format_simple_flags flags;
+	std::size_t width;  // int+float
+	int precision;      // float
+	unsigned int group; // int
+	char group_sep;     // int
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec() noexcept
+		: flags(0), width(0), precision(-1), group(0), group_sep(',') { }
+	MPT_CONSTEXPRINLINE format_simple_flags GetFlags() const noexcept {
+		return flags;
+	}
+	MPT_CONSTEXPRINLINE std::size_t GetWidth() const noexcept {
+		return width;
+	}
+	MPT_CONSTEXPRINLINE int GetPrecision() const noexcept {
+		return precision;
+	}
+	MPT_CONSTEXPRINLINE unsigned int GetGroup() const noexcept {
+		return group;
+	}
+	MPT_CONSTEXPRINLINE char GetGroupSep() const noexcept {
+		return group_sep;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetFlags(format_simple_flags f) noexcept {
+		flags = f;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetWidth(std::size_t w) noexcept {
+		width = w;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetPrecision(int p) noexcept {
+		precision = p;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetGroup(unsigned int g) noexcept {
+		group = g;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetGroupSep(char s) noexcept {
+		group_sep = s;
+		return *this;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & BaseDec() noexcept {
+		flags &= ~(format_simple_base::BaseDec | format_simple_base::BaseHex);
+		flags |= format_simple_base::BaseDec;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & BaseHex() noexcept {
+		flags &= ~(format_simple_base::BaseDec | format_simple_base::BaseHex);
+		flags |= format_simple_base::BaseHex;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & CaseLow() noexcept {
+		flags &= ~(format_simple_base::CaseLow | format_simple_base::CaseUpp);
+		flags |= format_simple_base::CaseLow;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & CaseUpp() noexcept {
+		flags &= ~(format_simple_base::CaseLow | format_simple_base::CaseUpp);
+		flags |= format_simple_base::CaseUpp;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillOff() noexcept {
+		flags &= ~(format_simple_base::FillOff | format_simple_base::FillNul);
+		flags |= format_simple_base::FillOff;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillNul() noexcept {
+		flags &= ~(format_simple_base::FillOff | format_simple_base::FillNul);
+		flags |= format_simple_base::FillNul;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaNrm() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaNrm;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaFix() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaFix;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaSci() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaSci;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Width(std::size_t w) noexcept {
+		width = w;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Prec(int p) noexcept {
+		precision = p;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Group(unsigned int g) noexcept {
+		group = g;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & GroupSep(char s) noexcept {
+		group_sep = s;
+		return *this;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & Dec() noexcept {
+		return BaseDec();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Hex() noexcept {
+		return BaseHex();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Low() noexcept {
+		return CaseLow();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Upp() noexcept {
+		return CaseUpp();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Off() noexcept {
+		return FillOff();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Nul() noexcept {
+		return FillNul();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Nrm() noexcept {
+		return NotaNrm();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Fix() noexcept {
+		return NotaFix();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Sci() noexcept {
+		return NotaSci();
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & Decimal() noexcept {
+		return BaseDec();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Hexadecimal() noexcept {
+		return BaseHex();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Lower() noexcept {
+		return CaseLow();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Upper() noexcept {
+		return CaseUpp();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillNone() noexcept {
+		return FillOff();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillZero() noexcept {
+		return FillNul();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatNormal() noexcept {
+		return NotaNrm();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatFixed() noexcept {
+		return NotaFix();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatScientific() noexcept {
+		return NotaSci();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Precision(int p) noexcept {
+		return Prec(p);
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_SPEC_HPP

Property changes on: src/mpt/string/format_simple_spec.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/parse.hpp
===================================================================
--- src/mpt/string/parse.hpp	(nonexistent)
+++ src/mpt/string/parse.hpp	(working copy)
@@ -0,0 +1,107 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_PARSE_HPP
+#define MPT_STRING_PARSE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <ios>
+#include <locale>
+#include <sstream>
+#include <string>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline std::string parse_as_internal_string_type(const std::string & s) {
+	return s;
+}
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+inline std::wstring parse_as_internal_string_type(const std::wstring & s) {
+	return s;
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_USTRING_MODE_WIDE
+template <typename Tstring>
+inline std::wstring parse_as_internal_string_type(const Tstring & s) {
+	return mpt::convert<std::wstring>(s);
+}
+#else  // !MPT_USTRING_MODE_WIDE
+template <typename Tstring>
+inline std::string parse_as_internal_string_type(const Tstring & s) {
+	return mpt::convert<std::string>(mpt::common_encoding::utf8, s);
+}
+#endif // MPT_USTRING_MODE_WIDE
+
+
+template <typename T, typename Tstring>
+inline T ConvertStringTo(const Tstring & str) {
+	std::basic_istringstream<typename decltype(mpt::parse_as_internal_string_type(mpt::as_string(str)))::value_type> stream(mpt::parse_as_internal_string_type(mpt::as_string(str)));
+	stream.imbue(std::locale::classic());
+	T value;
+	if constexpr (std::is_same<T, signed char>::value) {
+		signed int tmp;
+		if (!(stream >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else if constexpr (std::is_same<T, unsigned char>::value) {
+		unsigned int tmp;
+		if (!(stream >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else {
+		if (!(stream >> value)) {
+			return T{};
+		}
+	}
+	return value;
+}
+
+
+template <typename T, typename Tstring>
+inline T ConvertHexStringTo(const Tstring & str) {
+	std::basic_istringstream<typename decltype(mpt::parse_as_internal_string_type(mpt::as_string(str)))::value_type> stream(mpt::parse_as_internal_string_type(mpt::as_string(str)));
+	stream.imbue(std::locale::classic());
+	T value;
+	if constexpr (std::is_same<T, signed char>::value) {
+		signed int tmp;
+		if (!(stream >> std::hex >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else if constexpr (std::is_same<T, unsigned char>::value) {
+		unsigned int tmp;
+		if (!(stream >> std::hex >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else {
+		if (!(stream >> std::hex >> value)) {
+			return T{};
+		}
+	}
+	return value;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_PARSE_HPP

Property changes on: src/mpt/string/parse.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_buffer.hpp
===================================================================
--- src/mpt/string/tests/tests_string_buffer.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_buffer.hpp	(working copy)
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_BUFFER_HPP
+#define MPT_STRING_TESTS_STRING_BUFFER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/buffer.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_buffer{
+	"mpt/string/buffer",
+	[](mpt::test::context & context) {
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteAutoBuf(buf) = std::string("foobar");
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			char foobar[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'};
+			mpt::WriteTypedBuf<std::string>(buf) = (char *)foobar;
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteTypedBuf<std::string>(buf) = (const char *)"foobar";
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteTypedBuf<std::string>(buf) = "foobar";
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			const char buf[4] = {'f', 'o', 'o', 'b'};
+			std::string foo = mpt::ReadAutoBuf(buf);
+			MPT_TEST_EXPECT_EQUAL(foo, std::string("foob"));
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_BUFFER_HPP

Property changes on: src/mpt/string/tests/tests_string_buffer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_convert.hpp
===================================================================
--- src/mpt/string/tests/tests_string_convert.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_convert.hpp	(working copy)
@@ -0,0 +1,222 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_CONVERT_HPP
+#define MPT_STRING_TESTS_STRING_CONVERT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/convert_macros.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_convert{
+	"mpt/string/convert",
+	[](mpt::test::context & context) {
+		// MPT_UTF8_STRING version
+
+		// Charset conversions (basic sanity checks)
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "a"), MPT_USTRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "a"), MPT_USTRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "a"), MPT_USTRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "a"), MPT_USTRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "a"), MPT_UTF8_STRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "a"), MPT_UTF8_STRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "a"), MPT_UTF8_STRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "a"), MPT_UTF8_STRING("a"));
+
+#if MPT_OS_EMSCRIPTEN
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("\xe2\x8c\x82")), "\xe2\x8c\x82");
+#endif // MPT_OS_EMSCRIPTEN
+
+		// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
+		// We test german umlaut-a (U+00E4) (\xC3\xA4) and CJK U+5BB6 (\xE5\xAE\xB6)
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+
+		// Check that characters are correctly converted
+		// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+		// cp437
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\x84xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\x84xyz"));
+
+		// iso8859
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\xE4xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE4xyz"));
+
+		// utf8
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\xC3\xA4xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc\xE5\xAE\xB6xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"));
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+
+		// wide L"" version
+
+		// Charset conversions (basic sanity checks)
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "a"), L"a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "a"), L"a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "a"), L"a");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "a"), L"a");
+
+	// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
+	// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4428) // universal-character-name encountered in source
+#endif
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u00E4xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u5BB6xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), L"abc"));
+
+		// Check that characters are correctly converted
+		// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+		// cp437
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "abc\x84xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\x84xyz"));
+
+		// iso8859
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "abc\xE4xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE4xyz"));
+
+		// utf8
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "abc\xC3\xA4xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "abc\xE5\xAE\xB6xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u5BB6xyz", mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"));
+
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif
+
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_CONVERT_HPP

Property changes on: src/mpt/string/tests/tests_string_convert.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_format_message.hpp
===================================================================
--- src/mpt/string/tests/tests_string_format_message.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_format_message.hpp	(working copy)
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP
+#define MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_message.hpp"
+#include "mpt/string/format_message_macros.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_format_message{
+	"mpt/string/format_message",
+	[](mpt::test::context & context) {
+		static_assert(mpt::parse_format_string_argument_count("") == 0);
+		static_assert(mpt::parse_format_string_argument_count("{{") == 0);
+		static_assert(mpt::parse_format_string_argument_count("}}") == 0);
+		static_assert(mpt::parse_format_string_argument_count("{}") == 1);
+		static_assert(mpt::parse_format_string_argument_count("{}{}") == 2);
+		static_assert(mpt::parse_format_string_argument_count("{0}{1}") == 2);
+
+		// basic
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}{}{}")(1, 2, 3), "123");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{2}{1}{0}")(1, 2, 3), "321");
+
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{2}{1}{0}{4}{3}{6}{5}{7}{10}{9}{8}")(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a"), "21043657a98");
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE(L"{}{}{}")(1, 2, 3), L"123");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+		// escaping behviour
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%")(), "%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%")(), "%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%%")(), "%%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}")("a"), "a");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%")("a"), "a%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%")("a"), "a%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%%")("a"), "a%%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%1")(), "%1");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%{}")("a"), "%a");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%b")(), "%b");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{{}}")(), "{}");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{{{}}}")("a"), "{a}");
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP

Property changes on: src/mpt/string/tests/tests_string_format_message.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_format_simple.hpp
===================================================================
--- src/mpt/string/tests/tests_string_format_simple.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_format_simple.hpp	(working copy)
@@ -0,0 +1,154 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP
+#define MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_format_simple{
+	"mpt/string/format_simple",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(1.5f), "1.5");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(true), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(false), "0");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(0), "0");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(-23), "-23");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(42), "42");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<3>((int32)-1), "-001");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex((int32)-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(-0xabcde), "-abcde");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(std::numeric_limits<int32>::min()), "-80000000");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(std::numeric_limits<int32>::min() + 1), "-7fffffff");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(0x123e), "123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<6>(0x123e), "00123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<2>(0x123e), "123e");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(1), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(1), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(1), "01");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(1), "001");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(11), "011");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(-1), "-01");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(-1), "-001");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(0xa2345678), MPT_USTRING("A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(0xa2345678), MPT_USTRING("A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(0xa2345678), MPT_USTRING("0A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(0xa2345678), MPT_USTRING("00A2345678"));
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex(0x123e), L"123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex0<6>(0x123e), L"00123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex0<2>(0x123e), L"123e");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(-87.0f), "-87");
+		if (mpt::format<std::string>::val(-0.5e-6) != "-5e-007"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-5e-07"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-5e-7"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-7"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-07"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-007")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-005"
+			&& mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-05"
+			&& mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-5")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-005"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-05"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-5"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-005"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-05"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-5")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(58.65403492763) != "58.654034927630001"
+			&& mpt::format<std::string>::val(58.65403492763) != "58.65403492763")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(58.65403492763, 6), "58.654");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(23.42, 1), "23.4");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(234.2, 1), "234.2");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(2342.0, 1), "2342.0");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec(2, ';', 2345678), std::string("2;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec(2, ';', 12345678), std::string("12;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(3, ':', 0xa2345678), std::string("a2:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::dec(2, ';', 12345678), MPT_USTRING("12;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::hex(3, ':', 0xa2345678), MPT_USTRING("a2:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', 0xa2345678), MPT_USTRING("A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(3, ':', 0xa2345678), MPT_USTRING("A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(3, ':', 0xa2345678), MPT_USTRING("0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(3, ':', 0xa2345678), MPT_USTRING("0:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<11>(3, ':', 0xa2345678), MPT_USTRING("00:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<12>(3, ':', 0xa2345678), MPT_USTRING("000:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', -0x12345678), MPT_USTRING("-12:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(3, ':', -0x12345678), MPT_USTRING("-12:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(3, ':', -0x12345678), MPT_USTRING("-012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(3, ':', -0x12345678), MPT_USTRING("-0:012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<11>(3, ':', -0x12345678), MPT_USTRING("-00:012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<12>(3, ':', -0x12345678), MPT_USTRING("-000:012:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<5>(3, ':', 0x345678), MPT_USTRING("345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<6>(3, ':', 0x345678), MPT_USTRING("345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', 0x345678), MPT_USTRING("0:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<5>(3, ':', -0x345678), MPT_USTRING("-345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<6>(3, ':', -0x345678), MPT_USTRING("-345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', -0x345678), MPT_USTRING("-0:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::left(3, "a"), "a  ");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::right(3, "a"), "  a");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::center(3, "a"), " a ");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::center(4, "a"), " a  ");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(6.12345, 3), "6.12");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(6.12345, 3), "6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(6.12345, 4), "6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(6.12345, 4), "6.1235");
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::flt(6.12345, 3), L"6.12");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::fix(6.12345, 3), L"6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::flt(6.12345, 4), L"6.123");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP

Property changes on: src/mpt/string/tests/tests_string_format_simple.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_parse.hpp
===================================================================
--- src/mpt/string/tests/tests_string_parse.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_parse.hpp	(working copy)
@@ -0,0 +1,70 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_PARSE_HPP
+#define MPT_STRING_TESTS_STRING_PARSE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/parse.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_parse{
+	"mpt/string/parse",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("586"), 586u);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("2147483647"), (uint32)std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("4294967295"), std::numeric_limits<uint32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("-9223372036854775808"), std::numeric_limits<int64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("-159"), -159);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("9223372036854775807"), std::numeric_limits<int64>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("85059"), 85059u);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("9223372036854775807"), (uint64)std::numeric_limits<int64>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("18446744073709551615"), std::numeric_limits<uint64>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<float>("-87.0"), -87.0f);
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>("-0.5e-6"), -0.5e-6);
+#endif
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>("58.65403492763"), 58.65403492763);
+#else
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStrTo<double>("58.65403492763"), 58.65403492763, 0.0001);
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<float>(mpt::format<std::string>::val(-87.0)), -87.0f);
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>(mpt::format<std::string>::val(-0.5e-6)), -0.5e-6);
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned char>("fe"), 254);
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned char>(L"fe"), 254);
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned int>(MPT_USTRING("ffff")), 65535u);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_PARSE_HPP

Property changes on: src/mpt/string/tests/tests_string_parse.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_utility.hpp
===================================================================
--- src/mpt/string/tests/tests_string_utility.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_utility.hpp	(working copy)
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_UTILITY_HPP
+#define MPT_STRING_TESTS_STRING_UTILITY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/utility.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_utility{
+	"mpt/string/utility",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_left(std::string(" ")), "");
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_right(std::string(" ")), "");
+		MPT_TEST_EXPECT_EQUAL(mpt::trim(std::string(" ")), "");
+
+		// weird things with std::string containing \0 in the middle and trimming \0
+		MPT_TEST_EXPECT_EQUAL(std::string("\0\ta\0b ", 6).length(), (std::size_t)6);
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_right(std::string("\0\ta\0b ", 6)), std::string("\0\ta\0b", 5));
+		MPT_TEST_EXPECT_EQUAL(mpt::trim(std::string("\0\ta\0b\0", 6), std::string("\0", 1)), std::string("\ta\0b", 4));
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_UTILITY_HPP

Property changes on: src/mpt/string/tests/tests_string_utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/types.hpp
===================================================================
--- src/mpt/string/types.hpp	(nonexistent)
+++ src/mpt/string/types.hpp	(working copy)
@@ -0,0 +1,406 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TYPES_HPP
+#define MPT_STRING_TYPES_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <string>
+#include <type_traits>
+
+#include <cstddef>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+enum class common_encoding
+{
+	utf8,
+	ascii, // strictly 7-bit ASCII
+	iso8859_1,
+	iso8859_15,
+	cp850,
+	cp437,
+	windows1252,
+};
+
+
+enum class logical_encoding
+{
+	locale,        // CP_ACP on windows, system configured C locale otherwise
+	active_locale, // active C/C++ global locale
+};
+
+// source code / preprocessor (i.e. # token)
+inline constexpr auto source_encoding = common_encoding::ascii;
+
+// debug log files
+inline constexpr auto logfile_encoding = common_encoding::utf8;
+
+// std::clog / std::cout / std::cerr
+inline constexpr auto stdio_encoding = logical_encoding::locale;
+
+// getenv
+inline constexpr auto environment_encoding = logical_encoding::locale;
+
+// std::exception::what()
+inline constexpr auto exception_encoding = logical_encoding::active_locale;
+
+
+
+
+
+template <typename T>
+struct is_character : public std::false_type { };
+
+template <>
+struct is_character<char> : public std::true_type { };
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct is_character<wchar_t> : public std::true_type { };
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct is_character<char8_t> : public std::true_type { };
+#endif // C++20
+template <>
+struct is_character<char16_t> : public std::true_type { };
+template <>
+struct is_character<char32_t> : public std::true_type { };
+
+
+
+
+
+template <typename T>
+MPT_CONSTEXPRINLINE unsigned char char_value(T x) noexcept = delete;
+
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<char>(char x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<unsigned char>(unsigned char x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<char8_t>(char8_t x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+#endif // C++20
+
+
+
+
+
+template <typename T>
+struct unsafe_char_converter { };
+
+template <>
+struct unsafe_char_converter<char> {
+	static constexpr char32_t decode(char c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char encode(char32_t c) noexcept {
+		return static_cast<char>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct unsafe_char_converter<wchar_t> {
+	static constexpr char32_t decode(wchar_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr wchar_t encode(char32_t c) noexcept {
+		return static_cast<wchar_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct unsafe_char_converter<char8_t> {
+	static constexpr char32_t decode(char8_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char8_t encode(char32_t c) noexcept {
+		return static_cast<char8_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+#endif // C++20
+
+template <>
+struct unsafe_char_converter<char16_t> {
+	static constexpr char32_t decode(char16_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char16_t encode(char32_t c) noexcept {
+		return static_cast<char16_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+template <>
+struct unsafe_char_converter<char32_t> {
+	static constexpr char32_t decode(char32_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char32_t encode(char32_t c) noexcept {
+		return static_cast<char32_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+template <typename Tdstchar, typename Tsrcchar>
+constexpr Tdstchar unsafe_char_convert(Tsrcchar src) noexcept {
+	return mpt::unsafe_char_converter<Tdstchar>::encode(mpt::unsafe_char_converter<Tsrcchar>::decode(src));
+}
+
+
+
+
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+using widestring = std::wstring;
+using widechar = wchar_t;
+#define MPT_WIDECHAR(x)    L##x
+#define MPT_WIDELITERAL(x) L##x
+#define MPT_WIDESTRING(x)  std::wstring(L##x)
+#else // MPT_COMPILER_QUIRK_NO_WCHAR
+using widestring = std::u32string;
+using widechar = char32_t;
+#define MPT_WIDECHAR(x)    U##x
+#define MPT_WIDELITERAL(x) U##x
+#define MPT_WIDESTRING(x)  std::u32string(U##x)
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+
+template <common_encoding common_encoding_tag>
+struct common_encoding_char_traits : std::char_traits<char> {
+	static constexpr auto encoding() noexcept {
+		return common_encoding_tag;
+	}
+};
+
+template <logical_encoding logical_encoding_tag>
+struct logical_encoding_char_traits : std::char_traits<char> {
+	static constexpr auto encoding() noexcept {
+		return logical_encoding_tag;
+	}
+};
+
+
+
+using lstring = std::basic_string<char, mpt::logical_encoding_char_traits<logical_encoding::locale>>;
+
+using source_string = std::basic_string<char, mpt::common_encoding_char_traits<source_encoding>>;
+using exception_string = std::basic_string<char, mpt::logical_encoding_char_traits<exception_encoding>>;
+
+#if MPT_OS_WINDOWS
+
+template <typename Tchar>
+struct windows_char_traits { };
+template <>
+struct windows_char_traits<CHAR> { using string_type = mpt::lstring; };
+template <>
+struct windows_char_traits<WCHAR> { using string_type = std::wstring; };
+
+using tstring = windows_char_traits<TCHAR>::string_type;
+
+using winstring = mpt::tstring;
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using u8string = std::u8string;
+using u8char = char8_t;
+#define MPT_U8CHAR(x)    u8##x
+#define MPT_U8LITERAL(x) u8##x
+#define MPT_U8STRING(x)  std::u8string(u8##x)
+
+#else // !C++20
+
+using u8string = std::basic_string<char, mpt::common_encoding_char_traits<common_encoding::utf8>>;
+using u8char = char;
+#define MPT_U8CHAR(x)    x
+#define MPT_U8LITERAL(x) x
+#define MPT_U8STRING(x)  mpt::u8string(x)
+
+// mpt::u8string is a moderately type-safe string that is meant to contain
+// UTF-8 encoded char bytes.
+//
+// mpt::u8string is not implicitely convertible to/from std::string, but
+// it is convertible to/from C strings the same way as std::string is.
+//
+// The implementation of mpt::u8string is a compromise of compatibilty
+// with implementation-defined STL details, efficiency, source code size,
+// executable bloat, type-safety  and simplicity.
+//
+// mpt::u8string is not meant to be used directly though.
+// mpt::u8string is meant as an alternative implementaion to std::wstring
+// for implementing the unicode string type mpt::ustring.
+
+#endif // C++20
+
+
+
+#if !defined(MPT_USTRING_MODE_UTF8_FORCE) && (MPT_COMPILER_MSVC || (MPT_DETECTED_MFC && defined(UNICODE)))
+// Use wide strings for MSVC because this is the native encoding on
+// microsoft platforms.
+#define MPT_USTRING_MODE_WIDE 1
+#define MPT_USTRING_MODE_UTF8 0
+#else
+#define MPT_USTRING_MODE_WIDE 0
+#define MPT_USTRING_MODE_UTF8 1
+#endif
+
+// mpt::ustring
+//
+// mpt::ustring is a string type that can hold unicode strings.
+// It is implemented as a std::basic_string either based on wchar_t (i.e. the
+//  same as std::wstring) or a custom-defined char_traits class that is derived
+//  from std::char_traits<char>.
+// The selection of the underlying implementation is done at compile-time.
+// MPT_UCHAR, MPT_ULITERAL and MPT_USTRING are macros that ease construction
+//  of ustring char literals, ustring char array literals and ustring objects
+//  from ustring char literals that work consistently in both modes.
+//  Note that these are not supported for non-ASCII characters appearing in
+//  the macro argument.
+// Also note that, as both UTF8 and UTF16 (it is less of an issue for UTF32)
+//  are variable-length encodings and mpt::ustring is implemented as a
+//  std::basic_string, all member functions that require individual character
+//  access will not work consistently or even at all in a meaningful way.
+//  This in particular affects operator[], at(), find() and substr().
+//  The code makes no effort in preventing these or generating warnings when
+//  these are used on mpt::ustring objects. However, compiling in the
+//  respectively other mpt::ustring mode will catch most of these anyway.
+
+#if MPT_USTRING_MODE_WIDE
+#if MPT_USTRING_MODE_UTF8
+#error "MPT_USTRING_MODE_WIDE and MPT_USTRING_MODE_UTF8 are mutually exclusive."
+#endif
+
+using ustring = std::wstring;
+using uchar = wchar_t;
+#define MPT_UCHAR(x)    L##x
+#define MPT_ULITERAL(x) L##x
+#define MPT_USTRING(x)  std::wstring(L##x)
+
+#endif // MPT_USTRING_MODE_WIDE
+
+#if MPT_USTRING_MODE_UTF8
+#if MPT_USTRING_MODE_WIDE
+#error "MPT_USTRING_MODE_WIDE and MPT_USTRING_MODE_UTF8 are mutually exclusive."
+#endif
+
+using ustring = mpt::u8string;
+using uchar = mpt::u8char;
+#define MPT_UCHAR(x)    MPT_U8CHAR(x)
+#define MPT_ULITERAL(x) MPT_U8LITERAL(x)
+#define MPT_USTRING(x)  MPT_U8STRING(x)
+
+#endif // MPT_USTRING_MODE_UTF8
+
+
+
+template <typename T>
+struct make_string_type { };
+
+template <typename T, typename Ttraits>
+struct make_string_type<std::basic_string<T, Ttraits>> {
+	using type = std::basic_string<T, Ttraits>;
+};
+
+template <typename T>
+struct make_string_type<const T *> {
+	using type = std::basic_string<T>;
+};
+
+template <typename T>
+struct make_string_type<T *> {
+	using type = std::basic_string<T>;
+};
+
+template <typename T, std::size_t N>
+struct make_string_type<T[N]> {
+	using type = typename make_string_type<T *>::type;
+};
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct make_string_type<CStringW> {
+	using type = CStringW;
+};
+
+template <>
+struct make_string_type<CStringA> {
+	using type = CStringA;
+};
+
+#endif // MPT_DETECTED_MFC
+
+
+
+template <typename T>
+struct is_string_type : public std::false_type { };
+template <>
+struct is_string_type<std::string> : public std::true_type { };
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct is_string_type<std::wstring> : public std::true_type { };
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct is_string_type<std::u8string> : public std::true_type { };
+#endif // C++20
+template <>
+struct is_string_type<std::u16string> : public std::true_type { };
+template <>
+struct is_string_type<std::u32string> : public std::true_type { };
+#if MPT_DETECTED_MFC
+template <>
+struct is_string_type<CStringW> : public std::true_type { };
+template <>
+struct is_string_type<CStringA> : public std::true_type { };
+#endif // MPT_DETECTED_MFC
+template <typename T, typename Ttraits>
+struct is_string_type<std::basic_string<T, Ttraits>> : public std::true_type { };
+
+
+
+template <typename T>
+inline typename mpt::make_string_type<T>::type as_string(const T & str) {
+	if constexpr (std::is_pointer<typename std::remove_cv<T>::type>::value) {
+		return str ? typename mpt::make_string_type<T>::type{str} : typename mpt::make_string_type<T>::type{};
+	} else {
+		return str;
+	}
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TYPES_HPP

Property changes on: src/mpt/string/types.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/utility.hpp
===================================================================
--- src/mpt/string/utility.hpp	(nonexistent)
+++ src/mpt/string/utility.hpp	(working copy)
@@ -0,0 +1,334 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_UTILITY_HPP
+#define MPT_STRING_UTILITY_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+// string_traits abstract the API of underlying string classes, in particular they allow adopting to CString without having to specialize for CString explicitly
+
+template <typename Tstring>
+struct string_traits {
+
+	using string_type = Tstring;
+	using size_type = typename string_type::size_type;
+	using char_type = typename string_type::value_type;
+
+	static inline std::size_t length(const string_type & str) {
+		return str.length();
+	}
+
+	static inline void reserve(string_type & str, std::size_t size) {
+		str.reserve(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		return str.append(a);
+	}
+	static inline string_type & append(string_type & str, string_type && a) {
+		return str.append(std::move(a));
+	}
+	static inline string_type & append(string_type & str, std::size_t count, char_type c) {
+		return str.append(count, c);
+	}
+
+	static inline string_type pad(string_type str, std::size_t left, std::size_t right) {
+		str.insert(str.begin(), left, char_type(' '));
+		str.insert(str.end(), right, char_type(' '));
+		return str;
+	}
+};
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct string_traits<CStringA> {
+
+	using string_type = CStringA;
+	using size_type = int;
+	using char_type = typename CStringA::XCHAR;
+
+	static inline size_type length(const string_type & str) {
+		return str.GetLength();
+	}
+
+	static inline void reserve(string_type & str, size_type size) {
+		str.Preallocate(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		str += a;
+		return str;
+	}
+	static inline string_type & append(string_type & str, size_type count, char_type c) {
+		while (count--) {
+			str.AppendChar(c);
+		}
+		return str;
+	}
+
+	static inline string_type pad(const string_type & str, size_type left, size_type right) {
+		string_type tmp;
+		while (left--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		tmp += str;
+		while (right--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		return tmp;
+	}
+};
+
+template <>
+struct string_traits<CStringW> {
+
+	using string_type = CStringW;
+	using size_type = int;
+	using char_type = typename CStringW::XCHAR;
+
+	static inline size_type length(const string_type & str) {
+		return str.GetLength();
+	}
+
+	static inline void reserve(string_type & str, size_type size) {
+		str.Preallocate(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		str += a;
+		return str;
+	}
+	static inline string_type & append(string_type & str, size_type count, char_type c) {
+		while (count--) {
+			str.AppendChar(c);
+		}
+		return str;
+	}
+
+	static inline string_type pad(const string_type & str, size_type left, size_type right) {
+		string_type tmp;
+		while (left--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		tmp += str;
+		while (right--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		return tmp;
+	}
+};
+
+#endif // MPT_DETECTED_MFC
+
+
+template <typename Tchar>
+struct char_constants {
+	static inline constexpr Tchar space = ' ';
+	static inline constexpr Tchar a = 'a';
+	static inline constexpr Tchar z = 'z';
+	static inline constexpr Tchar A = 'A';
+	static inline constexpr Tchar Z = 'Z';
+	static inline constexpr Tchar lf = '\n';
+	static inline constexpr Tchar cr = '\r';
+	static inline constexpr Tchar tab = '\t';
+	static inline constexpr Tchar comma = ',';
+};
+
+template <>
+struct char_constants<char> {
+	static inline constexpr char space = ' ';
+	static inline constexpr char a = 'a';
+	static inline constexpr char z = 'z';
+	static inline constexpr char A = 'A';
+	static inline constexpr char Z = 'Z';
+	static inline constexpr char lf = '\n';
+	static inline constexpr char cr = '\r';
+	static inline constexpr char tab = '\t';
+	static inline constexpr char comma = ',';
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct char_constants<wchar_t> {
+	static inline constexpr wchar_t space = L' ';
+	static inline constexpr wchar_t a = L'a';
+	static inline constexpr wchar_t z = L'z';
+	static inline constexpr wchar_t A = L'A';
+	static inline constexpr wchar_t Z = L'Z';
+	static inline constexpr wchar_t lf = L'\n';
+	static inline constexpr wchar_t cr = L'\r';
+	static inline constexpr wchar_t tab = L'\t';
+	static inline constexpr wchar_t comma = L',';
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct char_constants<char8_t> {
+	static inline constexpr char8_t space = u8' ';
+	static inline constexpr char8_t a = u8'a';
+	static inline constexpr char8_t z = u8'z';
+	static inline constexpr char8_t A = u8'A';
+	static inline constexpr char8_t Z = u8'Z';
+	static inline constexpr char8_t lf = u8'\n';
+	static inline constexpr char8_t cr = u8'\r';
+	static inline constexpr char8_t tab = u8'\t';
+	static inline constexpr char8_t comma = u8',';
+};
+#endif
+
+template <>
+struct char_constants<char16_t> {
+	static inline constexpr char16_t space = u' ';
+	static inline constexpr char16_t a = u'a';
+	static inline constexpr char16_t z = u'z';
+	static inline constexpr char16_t A = u'A';
+	static inline constexpr char16_t Z = u'Z';
+	static inline constexpr char16_t lf = u'\n';
+	static inline constexpr char16_t cr = u'\r';
+	static inline constexpr char16_t tab = u'\t';
+	static inline constexpr char16_t comma = u',';
+};
+
+template <>
+struct char_constants<char32_t> {
+	static inline constexpr char32_t space = U' ';
+	static inline constexpr char32_t a = U'a';
+	static inline constexpr char32_t z = U'z';
+	static inline constexpr char32_t A = U'A';
+	static inline constexpr char32_t Z = U'Z';
+	static inline constexpr char32_t lf = U'\n';
+	static inline constexpr char32_t cr = U'\r';
+	static inline constexpr char32_t tab = U'\t';
+	static inline constexpr char32_t comma = U',';
+};
+
+
+template <typename Tstring>
+inline Tstring default_whitespace() {
+	Tstring result;
+	result.reserve(4);
+	result.push_back(char_constants<typename Tstring::value_type>::space);
+	result.push_back(char_constants<typename Tstring::value_type>::lf);
+	result.push_back(char_constants<typename Tstring::value_type>::cr);
+	result.push_back(char_constants<typename Tstring::value_type>::tab);
+	return result;
+}
+
+
+// Remove whitespace at start of string
+template <typename Tstring>
+inline Tstring trim_left(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	typename Tstring::size_type pos = str.find_first_not_of(whitespace);
+	if (pos != Tstring::npos) {
+		str.erase(str.begin(), str.begin() + pos);
+	} else if (pos == Tstring::npos && str.length() > 0 && str.find_last_of(whitespace) == str.length() - 1) {
+		return Tstring();
+	}
+	return str;
+}
+
+// Remove whitespace at end of string
+template <typename Tstring>
+inline Tstring trim_right(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	typename Tstring::size_type pos = str.find_last_not_of(whitespace);
+	if (pos != Tstring::npos) {
+		str.erase(str.begin() + pos + 1, str.end());
+	} else if (pos == Tstring::npos && str.length() > 0 && str.find_first_of(whitespace) == 0) {
+		return Tstring();
+	}
+	return str;
+}
+
+// Remove whitespace at start and end of string
+template <typename Tstring>
+inline Tstring trim(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	return trim_right(trim_left(str, whitespace), whitespace);
+}
+
+
+template <typename Tstring, typename Tmatch>
+inline bool starts_with(const Tstring & str, const Tmatch & match) {
+	return (str.find(typename mpt::make_string_type<Tmatch>::type{match}) == 0);
+}
+
+template <typename Tstring, typename Tmatch>
+inline bool ends_with(const Tstring & str, const Tmatch & match) {
+	return (str.rfind(typename mpt::make_string_type<Tmatch>::type{match}) == (str.length() - typename mpt::make_string_type<Tmatch>::type{match}.length()));
+}
+
+
+template <typename Tchar>
+inline constexpr Tchar to_lower_ascii(Tchar c) noexcept {
+	if (char_constants<Tchar>::A <= c && c <= char_constants<Tchar>::Z) {
+		c += char_constants<Tchar>::a - char_constants<Tchar>::A;
+	}
+	return c;
+}
+
+template <typename Tchar>
+inline constexpr Tchar to_upper_ascii(Tchar c) noexcept {
+	if (char_constants<Tchar>::a <= c && c <= char_constants<Tchar>::z) {
+		c -= char_constants<Tchar>::a - char_constants<Tchar>::A;
+	}
+	return c;
+}
+
+
+
+template <typename Tstring>
+inline std::vector<Tstring> split(const Tstring & str, const Tstring & sep = Tstring(1, char_constants<typename Tstring::value_type>::comma)) {
+	std::vector<Tstring> vals;
+	std::size_t pos = 0;
+	while (str.find(sep, pos) != std::string::npos) {
+		vals.push_back(str.substr(pos, str.find(sep, pos) - pos));
+		pos = str.find(sep, pos) + sep.length();
+	}
+	if (!vals.empty() || (str.substr(pos).length() > 0)) {
+		vals.push_back(str.substr(pos));
+	}
+	return vals;
+}
+
+
+
+template <typename Tstring>
+inline Tstring combine(const std::vector<Tstring> & vals, const Tstring & sep = Tstring(1, char_constants<typename Tstring::value_type>::comma)) {
+	Tstring str;
+	for (std::size_t i = 0; i < vals.size(); ++i) {
+		if (i > 0) {
+			str += sep;
+		}
+		str += vals[i];
+	}
+	return str;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_UTILITY_HPP

Property changes on: src/mpt/string/utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/buffer.hpp
===================================================================
--- src/mpt/string/buffer.hpp	(nonexistent)
+++ src/mpt/string/buffer.hpp	(working copy)
@@ -0,0 +1,344 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_BUFFER_HPP
+#define MPT_STRING_BUFFER_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/types.hpp"
+
+#include <algorithm>
+#include <array>
+#include <string>
+#include <string_view>
+#include <type_traits>
+
+#include <cassert>
+#include <cstddef>
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+
+template <typename Tstring, typename Tchar>
+class StringBufRefImpl {
+private:
+	Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit StringBufRefImpl(Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		static_assert(sizeof(Tchar) == sizeof(typename Tstring::value_type));
+		assert(size > 0);
+	}
+	StringBufRefImpl(const StringBufRefImpl &) = delete;
+	StringBufRefImpl(StringBufRefImpl &&) = default;
+	StringBufRefImpl & operator=(const StringBufRefImpl &) = delete;
+	StringBufRefImpl & operator=(StringBufRefImpl &&) = delete;
+	operator Tstring() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return Tstring(buf, buf + len);
+	}
+	explicit operator std::basic_string_view<Tchar>() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return std::basic_string_view<Tchar>(buf, buf + len);
+	}
+	bool empty() const {
+		return buf[0] == Tchar('\0');
+	}
+	StringBufRefImpl & operator=(const Tstring & str) {
+		std::copy(str.data(), str.data() + std::min(str.length(), size - 1), buf);
+		std::fill(buf + std::min(str.length(), size - 1), buf + size, Tchar('\0'));
+		return *this;
+	}
+};
+
+template <typename Tstring, typename Tchar>
+class StringBufRefImpl<Tstring, const Tchar> {
+private:
+	const Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit StringBufRefImpl(const Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		static_assert(sizeof(Tchar) == sizeof(typename Tstring::value_type));
+		assert(size > 0);
+	}
+	StringBufRefImpl(const StringBufRefImpl &) = delete;
+	StringBufRefImpl(StringBufRefImpl &&) = default;
+	StringBufRefImpl & operator=(const StringBufRefImpl &) = delete;
+	StringBufRefImpl & operator=(StringBufRefImpl &&) = delete;
+	operator Tstring() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return Tstring(buf, buf + len);
+	}
+	explicit operator std::basic_string_view<Tchar>() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return std::basic_string_view<Tchar>(buf, len);
+	}
+	bool empty() const {
+		return buf[0] == Tchar('\0');
+	}
+};
+
+
+
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tstring, typename Tchar>
+inline StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type> ReadTypedBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<Tstring, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<Tstring, Tchar>(buf.data(), size);
+}
+template <typename Tstring, typename Tchar, std::size_t size>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<Tstring, Tchar>(buf, size);
+}
+template <typename Tstring, typename Tchar>
+inline StringBufRefImpl<Tstring, Tchar> WriteTypedBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<Tstring, Tchar>(buf, size);
+}
+
+
+
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type> ReadAutoBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar> WriteAutoBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename std::basic_string<typename std::remove_const<Tchar>::type>, Tchar>(buf, size);
+}
+
+
+
+#if MPT_OS_WINDOWS
+
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type> ReadWinBuf(const Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(std::array<Tchar, size> & buf) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(Tchar (&buf)[size]) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf, size);
+}
+template <typename Tchar>
+inline StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar> WriteWinBuf(Tchar * buf, std::size_t size) {
+	return StringBufRefImpl<typename mpt::windows_char_traits<typename std::remove_const<Tchar>::type>::string_type, Tchar>(buf, size);
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_DETECTED_MFC
+
+template <typename Tchar>
+class CStringBufRefImpl {
+private:
+	Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit CStringBufRefImpl(Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		assert(size > 0);
+	}
+	CStringBufRefImpl(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl(CStringBufRefImpl &&) = default;
+	CStringBufRefImpl & operator=(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl & operator=(CStringBufRefImpl &&) = delete;
+	operator CString() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return CString(buf, mpt::saturate_cast<int>(len));
+	}
+	CStringBufRefImpl & operator=(const CString & str) {
+		std::copy(str.GetString(), str.GetString() + std::min(static_cast<std::size_t>(str.GetLength()), size - 1), buf);
+		std::fill(buf + std::min(static_cast<std::size_t>(str.GetLength()), size - 1), buf + size, Tchar('\0'));
+		return *this;
+	}
+};
+
+template <typename Tchar>
+class CStringBufRefImpl<const Tchar> {
+private:
+	const Tchar * buf;
+	std::size_t size;
+
+public:
+	// cppcheck false-positive
+	// cppcheck-suppress uninitMemberVar
+	explicit CStringBufRefImpl(const Tchar * buf_, std::size_t size_)
+		: buf(buf_)
+		, size(size_) {
+		assert(size > 0);
+	}
+	CStringBufRefImpl(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl(CStringBufRefImpl &&) = default;
+	CStringBufRefImpl & operator=(const CStringBufRefImpl &) = delete;
+	CStringBufRefImpl & operator=(CStringBufRefImpl &&) = delete;
+	operator CString() const {
+		std::size_t len = std::find(buf, buf + size, Tchar('\0')) - buf; // terminate at \0
+		return CString(buf, mpt::saturate_cast<int>(len));
+	}
+};
+
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const std::array<Tchar, size> & buf) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const Tchar (&buf)[size]) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar>
+inline CStringBufRefImpl<typename std::add_const<Tchar>::type> ReadCStringBuf(const Tchar * buf, std::size_t size) {
+	return CStringBufRefImpl<typename std::add_const<Tchar>::type>(buf, size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(std::array<Tchar, size> & buf) {
+	return CStringBufRefImpl<Tchar>(buf.data(), size);
+}
+template <typename Tchar, std::size_t size>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(Tchar (&buf)[size]) {
+	return CStringBufRefImpl<Tchar>(buf, size);
+}
+template <typename Tchar>
+inline CStringBufRefImpl<Tchar> WriteCStringBuf(Tchar * buf, std::size_t size) {
+	return CStringBufRefImpl<Tchar>(buf, size);
+}
+
+#endif // MPT_DETECTED_MFC
+
+
+
+template <std::size_t len>
+struct charbuf {
+public:
+	using Tchar = char;
+	using char_type = Tchar;
+	using string_type = std::basic_string<Tchar>;
+	using string_view_type = std::basic_string_view<Tchar>;
+	constexpr std::size_t static_length() const {
+		return len;
+	}
+
+public:
+	Tchar buf[len];
+
+public:
+	charbuf() {
+		std::fill(std::begin(buf), std::end(buf), Tchar('\0'));
+	}
+	charbuf(const charbuf &) = default;
+	charbuf(charbuf &&) = default;
+	charbuf & operator=(const charbuf &) = default;
+	charbuf & operator=(charbuf &&) = default;
+	const Tchar & operator[](std::size_t i) const {
+		return buf[i];
+	}
+	std::string str() const {
+		return static_cast<std::string>(*this);
+	}
+	operator string_type() const {
+		return mpt::ReadAutoBuf(buf);
+	}
+	explicit operator string_view_type() const {
+		return static_cast<string_view_type>(mpt::ReadAutoBuf(buf));
+	}
+	bool empty() const {
+		return mpt::ReadAutoBuf(buf).empty();
+	}
+	charbuf & operator=(const string_type & str) {
+		mpt::WriteAutoBuf(buf) = str;
+		return *this;
+	}
+
+public:
+	friend bool operator!=(const charbuf & a, const charbuf & b) {
+		return static_cast<string_view_type>(a) != static_cast<string_view_type>(b);
+	}
+	friend bool operator!=(const std::string & a, const charbuf & b) {
+		return a != static_cast<string_view_type>(b);
+	}
+	friend bool operator!=(const charbuf & a, const std::string & b) {
+		return static_cast<string_view_type>(a) != b;
+	}
+	friend bool operator==(const charbuf & a, const charbuf & b) {
+		return static_cast<string_view_type>(a) == static_cast<string_view_type>(b);
+	}
+	friend bool operator==(const std::string & a, const charbuf & b) {
+		return a == static_cast<string_view_type>(b);
+	}
+	friend bool operator==(const charbuf & a, const std::string & b) {
+		return static_cast<string_view_type>(a) == b;
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_BUFFER_HPP

Property changes on: src/mpt/string/buffer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/convert.hpp
===================================================================
--- src/mpt/string/convert.hpp	(nonexistent)
+++ src/mpt/string/convert.hpp	(working copy)
@@ -0,0 +1,1131 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_CONVERT_HPP
+#define MPT_STRING_CONVERT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/saturate_cast.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/types.hpp"
+
+#include <array>
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#include <locale>
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#include <stdexcept>
+#include <string>
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#include <type_traits>
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#include <vector>
+
+#if MPT_OS_DJGPP
+#include <cstring>
+#endif // MPT_OS_DJGPP
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_DJGPP
+#include <dpmi.h>
+#endif // MPT_OS_DJGPP
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+/*
+default 1:1 mapping
+inline constexpr char32_t CharsetTableISO8859_1[256] = {
+	0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b,0x000c,0x000d,0x000e,0x000f,
+	0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,0x0018,0x0019,0x001a,0x001b,0x001c,0x001d,0x001e,0x001f,
+	0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f,
+	0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f,
+	0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f,
+	0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f,
+	0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f,
+	0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x007f,
+	0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008a,0x008b,0x008c,0x008d,0x008e,0x008f,
+	0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x009b,0x009c,0x009d,0x009e,0x009f,
+	0x00a0,0x00a1,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00ab,0x00ac,0x00ad,0x00ae,0x00af,
+	0x00b0,0x00b1,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00bb,0x00bc,0x00bd,0x00be,0x00bf,
+	0x00c0,0x00c1,0x00c2,0x00c3,0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00cb,0x00cc,0x00cd,0x00ce,0x00cf,
+	0x00d0,0x00d1,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00db,0x00dc,0x00dd,0x00de,0x00df,
+	0x00e0,0x00e1,0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00eb,0x00ec,0x00ed,0x00ee,0x00ef,
+	0x00f0,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,0x00f9,0x00fa,0x00fb,0x00fc,0x00fd,0x00fe,0x00ff
+};
+*/
+
+inline constexpr char32_t CharsetTableISO8859_15[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+	0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+	0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+	0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+	0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
+	0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+	0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+	0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+	0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
+
+inline constexpr char32_t CharsetTableWindows1252[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+	0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f,
+	0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178,
+	0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+	0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+	0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+	0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+	0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+	0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff};
+
+inline constexpr char32_t CharsetTableCP850[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+	0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+	0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00F8, 0x00a3, 0x00D8, 0x00D7, 0x0192,
+	0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x00AE, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255d, 0x00A2, 0x00A5, 0x2510,
+	0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x00E3, 0x00C3, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x00A4,
+	0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250c, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580,
+	0x00D3, 0x00df, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00b5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4,
+	0x00AD, 0x00b1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00f7, 0x00B8, 0x00b0, 0x00A8, 0x00b7, 0x00B9, 0x00B3, 0x00b2, 0x25a0, 0x00a0};
+
+inline constexpr char32_t CharsetTableCP437[256] = {
+	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+	0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+	0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+	0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+	0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+	0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+	0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+	0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+	0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9, 0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
+	0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba, 0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+	0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
+	0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
+	0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
+	0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4, 0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229,
+	0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0};
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_8bit(const Tsrcstring & str, const char32_t (&table)[256], mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		std::size_t c = static_cast<std::size_t>(mpt::char_value(str[i]));
+		if (c < std::size(table)) {
+			res.push_back(static_cast<mpt::widechar>(table[c]));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_8bit(const mpt::widestring & str, const char32_t (&table)[256], char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		bool found = false;
+		// Try non-control characters first.
+		// In cases where there are actual characters mirrored in this range (like in AMS/AMS2 character sets),
+		// characters in the common range are preferred this way.
+		for (std::size_t x = 0x20; x < std::size(table); ++x) {
+			if (c == table[x]) {
+				res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
+				found = true;
+				break;
+			}
+		}
+		if (!found) {
+			// try control characters
+			for (std::size_t x = 0x00; x < std::size(table) && x < 0x20; ++x) {
+				if (c == table[x]) {
+					res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(x)));
+					found = true;
+					break;
+				}
+			}
+		}
+		if (!found) {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_ascii(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		uint8 c = str[i];
+		if (c <= 0x7f) {
+			res.push_back(static_cast<mpt::widechar>(static_cast<uint32>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_ascii(const mpt::widestring & str, char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		if (c <= 0x7f) {
+			res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_iso8859_1(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	MPT_UNUSED(replacement);
+	mpt::widestring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		uint8 c = str[i];
+		res.push_back(static_cast<mpt::widechar>(static_cast<uint32>(c)));
+	}
+	return res;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_iso8859_1(const mpt::widestring & str, char replacement = '?') {
+	Tdststring res;
+	res.reserve(str.length());
+	for (std::size_t i = 0; i < str.length(); ++i) {
+		char32_t c = static_cast<char32_t>(str[i]);
+		if (c <= 0xff) {
+			res.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint8>(c)));
+		} else {
+			res.push_back(replacement);
+		}
+	}
+	return res;
+}
+
+
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_utf8(const Tsrcstring & str, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	const Tsrcstring & in = str;
+	mpt::widestring out;
+	// state:
+	std::size_t charsleft = 0;
+	char32_t ucs4 = 0;
+	for (uint8 c : in) {
+		if (charsleft == 0) {
+			if ((c & 0x80) == 0x00) {
+				out.push_back(static_cast<mpt::widechar>(c));
+			} else if ((c & 0xE0) == 0xC0) {
+				ucs4 = c & 0x1F;
+				charsleft = 1;
+			} else if ((c & 0xF0) == 0xE0) {
+				ucs4 = c & 0x0F;
+				charsleft = 2;
+			} else if ((c & 0xF8) == 0xF0) {
+				ucs4 = c & 0x07;
+				charsleft = 3;
+			} else {
+				out.push_back(replacement);
+				ucs4 = 0;
+				charsleft = 0;
+			}
+		} else {
+			if ((c & 0xC0) != 0x80) {
+				out.push_back(replacement);
+				ucs4 = 0;
+				charsleft = 0;
+			}
+			ucs4 <<= 6;
+			ucs4 |= c & 0x3F;
+			charsleft--;
+			if (charsleft == 0) {
+				if constexpr (sizeof(mpt::widechar) == 2) {
+					if (ucs4 > 0x1fffff) {
+						out.push_back(replacement);
+						ucs4 = 0;
+						charsleft = 0;
+					}
+					if (ucs4 <= 0xffff) {
+						out.push_back(static_cast<mpt::widechar>(ucs4));
+					} else {
+						uint32 surrogate = static_cast<uint32>(ucs4) - 0x10000;
+						uint16 hi_sur = static_cast<uint16>((0x36 << 10) | ((surrogate >> 10) & ((1 << 10) - 1)));
+						uint16 lo_sur = static_cast<uint16>((0x37 << 10) | ((surrogate >> 0) & ((1 << 10) - 1)));
+						out.push_back(hi_sur);
+						out.push_back(lo_sur);
+					}
+				} else {
+					out.push_back(static_cast<mpt::widechar>(ucs4));
+				}
+				ucs4 = 0;
+			}
+		}
+	}
+	if (charsleft != 0) {
+		out.push_back(replacement);
+		ucs4 = 0;
+		charsleft = 0;
+	}
+	return out;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_utf8(const mpt::widestring & str, char replacement = '?') {
+	const mpt::widestring & in = str;
+	Tdststring out;
+	for (std::size_t i = 0; i < in.length(); i++) {
+		mpt::widechar wc = in[i];
+		char32_t ucs4 = 0;
+		if constexpr (sizeof(mpt::widechar) == 2) {
+			uint16 c = static_cast<uint16>(wc);
+			if (i + 1 < in.length()) {
+				// check for surrogate pair
+				uint16 hi_sur = in[i + 0];
+				uint16 lo_sur = in[i + 1];
+				if (hi_sur >> 10 == 0x36 && lo_sur >> 10 == 0x37) {
+					// surrogate pair
+					++i;
+					hi_sur &= (1 << 10) - 1;
+					lo_sur &= (1 << 10) - 1;
+					ucs4 = (static_cast<uint32>(hi_sur) << 10) | (static_cast<uint32>(lo_sur) << 0);
+				} else {
+					// no surrogate pair
+					ucs4 = static_cast<char32_t>(c);
+				}
+			} else {
+				// no surrogate possible
+				ucs4 = static_cast<char32_t>(c);
+			}
+		} else {
+			ucs4 = static_cast<char32_t>(wc);
+		}
+		if (ucs4 > 0x1fffff) {
+			out.push_back(replacement);
+			continue;
+		}
+		uint8 utf8[6];
+		std::size_t numchars = 0;
+		for (numchars = 0; numchars < 6; numchars++) {
+			utf8[numchars] = ucs4 & 0x3F;
+			ucs4 >>= 6;
+			if (ucs4 == 0) {
+				break;
+			}
+		}
+		numchars++;
+		if (numchars == 1) {
+			out.push_back(utf8[0]);
+			continue;
+		}
+		if (numchars == 2 && utf8[numchars - 1] == 0x01) {
+			// generate shortest form
+			out.push_back(utf8[0] | 0x40);
+			continue;
+		}
+		std::size_t charsleft = numchars;
+		while (charsleft > 0) {
+			if (charsleft == numchars) {
+				out.push_back(utf8[charsleft - 1] | (((1 << numchars) - 1) << (8 - numchars)));
+			} else {
+				// cppcheck false-positive
+				// cppcheck-suppress arrayIndexOutOfBounds
+				out.push_back(utf8[charsleft - 1] | 0x80);
+			}
+			charsleft--;
+		}
+	}
+	return out;
+}
+
+
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring utf32_from_utf16(const Tsrcstring & in, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == 2);
+	static_assert(sizeof(typename Tdststring::value_type) == 4);
+	MPT_UNUSED(replacement);
+	Tdststring out;
+	out.reserve(in.length());
+	for (std::size_t i = 0; i < in.length(); i++) {
+		char16_t wc = static_cast<char16_t>(static_cast<uint16>(in[i]));
+		char32_t ucs4 = 0;
+		uint16 c = static_cast<uint16>(wc);
+		if (i + 1 < in.length()) {
+			// check for surrogate pair
+			uint16 hi_sur = in[i + 0];
+			uint16 lo_sur = in[i + 1];
+			if (hi_sur >> 10 == 0x36 && lo_sur >> 10 == 0x37) {
+				// surrogate pair
+				++i;
+				hi_sur &= (1 << 10) - 1;
+				lo_sur &= (1 << 10) - 1;
+				ucs4 = (static_cast<uint32>(hi_sur) << 10) | (static_cast<uint32>(lo_sur) << 0);
+			} else {
+				// no surrogate pair
+				ucs4 = static_cast<char32_t>(c);
+			}
+		} else {
+			// no surrogate possible
+			ucs4 = static_cast<char32_t>(c);
+		}
+		out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint32>(ucs4)));
+	}
+	return out;
+}
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring utf16_from_utf32(const Tsrcstring & in, mpt::widechar replacement = MPT_WIDECHAR('\uFFFD')) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == 4);
+	static_assert(sizeof(typename Tdststring::value_type) == 2);
+	Tdststring out;
+	out.reserve(in.length());
+	for (std::size_t i = 0; i < in.length(); i++) {
+		char32_t ucs4 = static_cast<char32_t>(static_cast<uint32>(in[i]));
+		if (ucs4 > 0x1fffff) {
+			out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint16>(replacement)));
+			ucs4 = 0;
+		}
+		if (ucs4 <= 0xffff) {
+			out.push_back(static_cast<typename Tdststring::value_type>(static_cast<uint16>(ucs4)));
+		} else {
+			uint32 surrogate = static_cast<uint32>(ucs4) - 0x10000;
+			uint16 hi_sur = static_cast<uint16>((0x36 << 10) | ((surrogate >> 10) & ((1 << 10) - 1)));
+			uint16 lo_sur = static_cast<uint16>((0x37 << 10) | ((surrogate >> 0) & ((1 << 10) - 1)));
+			out.push_back(static_cast<typename Tdststring::value_type>(hi_sur));
+			out.push_back(static_cast<typename Tdststring::value_type>(lo_sur));
+		}
+	}
+	return out;
+}
+
+
+
+#if MPT_OS_WINDOWS
+
+inline bool has_codepage(UINT cp) {
+	return IsValidCodePage(cp) ? true : false;
+}
+
+inline bool windows_has_encoding(common_encoding encoding) {
+	bool result = false;
+	switch (encoding) {
+		case common_encoding::utf8:
+			result = has_codepage(CP_UTF8);
+			break;
+		case common_encoding::ascii:
+			result = has_codepage(20127);
+			break;
+		case common_encoding::iso8859_1:
+			result = has_codepage(28591);
+			break;
+		case common_encoding::iso8859_15:
+			result = has_codepage(28605);
+			break;
+		case common_encoding::cp850:
+			result = has_codepage(850);
+			break;
+		case common_encoding::cp437:
+			result = has_codepage(437);
+			break;
+		case common_encoding::windows1252:
+			result = has_codepage(1252);
+			break;
+	}
+	return result;
+}
+
+inline bool windows_has_encoding(logical_encoding encoding) {
+	bool result = false;
+	switch (encoding) {
+		case logical_encoding::locale:
+			result = true;
+			break;
+		case logical_encoding::active_locale:
+			result = false;
+			break;
+	}
+	return result;
+}
+
+inline UINT codepage_from_encoding(logical_encoding encoding) {
+	UINT result = 0;
+	switch (encoding) {
+		case logical_encoding::locale:
+			result = CP_ACP;
+			break;
+		case logical_encoding::active_locale:
+			result = 0;
+			break;
+	}
+	return result;
+}
+
+inline UINT codepage_from_encoding(common_encoding encoding) {
+	UINT result = 0;
+	switch (encoding) {
+		case common_encoding::utf8:
+			result = CP_UTF8;
+			break;
+		case common_encoding::ascii:
+			result = 20127;
+			break;
+		case common_encoding::iso8859_1:
+			result = 28591;
+			break;
+		case common_encoding::iso8859_15:
+			result = 28605;
+			break;
+		case common_encoding::cp850:
+			result = 850;
+			break;
+		case common_encoding::cp437:
+			result = 437;
+			break;
+		case common_encoding::windows1252:
+			result = 1252;
+			break;
+	}
+	return result;
+}
+
+template <typename Tdststring>
+inline Tdststring encode_codepage(UINT codepage, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	Tdststring encoded_string;
+	int required_size = WideCharToMultiByte(codepage, 0, src.data(), mpt::saturate_cast<int>(src.size()), nullptr, 0, nullptr, nullptr);
+	if (required_size > 0) {
+		encoded_string.resize(required_size);
+		WideCharToMultiByte(codepage, 0, src.data(), mpt::saturate_cast<int>(src.size()), reinterpret_cast<CHAR *>(encoded_string.data()), required_size, nullptr, nullptr);
+	}
+	return encoded_string;
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_codepage(UINT codepage, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	mpt::widestring decoded_string;
+	int required_size = MultiByteToWideChar(codepage, 0, reinterpret_cast<const CHAR *>(src.data()), mpt::saturate_cast<int>(src.size()), nullptr, 0);
+	if (required_size > 0) {
+		decoded_string.resize(required_size);
+		MultiByteToWideChar(codepage, 0, reinterpret_cast<const CHAR *>(src.data()), mpt::saturate_cast<int>(src.size()), decoded_string.data(), required_size);
+	}
+	return decoded_string;
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_OS_DJGPP
+
+inline common_encoding djgpp_get_locale_encoding() {
+	uint16 active_codepage = 437;
+	uint16 system_codepage = 437;
+	__dpmi_regs regs;
+	std::memset(&regs, 0, sizeof(__dpmi_regs));
+	regs.x.ax = 0x6601;
+	if (__dpmi_int(0x21, &regs) == 0) {
+		int cf = (regs.x.flags >> 0) & 1;
+		if (cf == 0) {
+			active_codepage = regs.x.bx;
+			system_codepage = regs.x.dx;
+		}
+	}
+	common_encoding result = common_encoding::cp437;
+	if (active_codepage == 0) {
+		result = common_encoding::cp437;
+	} else if (active_codepage == 437) {
+		result = common_encoding::cp437;
+	} else if (active_codepage == 850) {
+		result = common_encoding::cp850;
+	} else if (system_codepage == 437) {
+		result = common_encoding::cp437;
+	} else if (system_codepage == 850) {
+		result = common_encoding::cp850;
+	} else {
+		result = common_encoding::cp437;
+	}
+	return result;
+}
+
+#endif // MPT_OS_DJGPP
+
+
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+
+// Note:
+//
+//  std::codecvt::out in LLVM libc++ does not advance in and out pointers when
+// running into a non-convertible character. This can happen when no locale is
+// set on FreeBSD or MacOSX. This behaviour violates the C++ standard.
+//
+//  We apply the following (albeit costly, even on other platforms) work-around:
+//  If the conversion errors out and does not advance the pointers at all, we
+// retry the conversion with a space character prepended to the string. If it
+// still does error out, we retry the whole conversion character by character.
+//  This is costly even on other platforms in one single case: The first
+// character is an invalid Unicode code point or otherwise not convertible. Any
+// following non-convertible characters are not a problem.
+
+inline std::wstring decode_locale_impl(const std::string & str, const std::locale & locale, wchar_t replacement = L'\uFFFD', int retry = 0, bool * progress = nullptr) {
+	if (str.empty()) {
+		return std::wstring();
+	}
+	std::vector<wchar_t> out;
+	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
+	std::mbstate_t state = std::mbstate_t();
+	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
+	codecvt_type::result result = codecvt_type::partial;
+	const char * in_begin = str.data();
+	const char * in_end = in_begin + str.size();
+	out.resize((in_end - in_begin) * (mpt::saturate_cast<std::size_t>(facet.max_length()) + 1));
+	wchar_t * out_begin = out.data();
+	wchar_t * out_end = out.data() + out.size();
+	const char * in_next = nullptr;
+	wchar_t * out_next = nullptr;
+	do {
+		if (retry == 2) {
+			for (;;) {
+				in_next = nullptr;
+				out_next = nullptr;
+				result = facet.in(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
+				if (result == codecvt_type::partial && in_next == in_begin + 1) {
+					in_begin = in_next;
+					out_begin = out_next;
+					continue;
+				} else {
+					break;
+				}
+			}
+		} else {
+			in_next = nullptr;
+			out_next = nullptr;
+			result = facet.in(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
+		}
+		if (result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end)) {
+			out.resize(out.size() * 2);
+			in_begin = in_next;
+			out_begin = out.data() + (out_next - out_begin);
+			out_end = out.data() + out.size();
+			continue;
+		}
+		if (retry == 0) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				bool made_progress = true;
+				decode_locale_impl(std::string(" ") + str, locale, replacement, 1, &made_progress);
+				if (!made_progress) {
+					return decode_locale_impl(str, locale, replacement, 2);
+				}
+			}
+		} else if (retry == 1) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				*progress = false;
+			} else {
+				*progress = true;
+			}
+			return std::wstring();
+		}
+		if (result == codecvt_type::error) {
+			++in_next;
+			*out_next = replacement;
+			++out_next;
+		}
+		in_begin = in_next;
+		out_begin = out_next;
+	} while ((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
+	return std::wstring(out.data(), out_next);
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode_locale(const std::locale & locale, const Tsrcstring & src) {
+	if constexpr (std::is_same<Tsrcstring, std::string>::value) {
+		return decode_locale_impl(src, locale);
+	} else {
+		return decode_locale_impl(std::string(src.begin(), src.end()), locale);
+	}
+}
+
+inline std::string encode_locale_impl(const std::wstring & str, const std::locale & locale, char replacement = '?', int retry = 0, bool * progress = nullptr) {
+	if (str.empty()) {
+		return std::string();
+	}
+	std::vector<char> out;
+	using codecvt_type = std::codecvt<wchar_t, char, std::mbstate_t>;
+	std::mbstate_t state = std::mbstate_t();
+	const codecvt_type & facet = std::use_facet<codecvt_type>(locale);
+	codecvt_type::result result = codecvt_type::partial;
+	const wchar_t * in_begin = str.data();
+	const wchar_t * in_end = in_begin + str.size();
+	out.resize((in_end - in_begin) * (mpt::saturate_cast<std::size_t>(facet.max_length()) + 1));
+	char * out_begin = out.data();
+	char * out_end = out.data() + out.size();
+	const wchar_t * in_next = nullptr;
+	char * out_next = nullptr;
+	do {
+		if (retry == 2) {
+			for (;;) {
+				in_next = nullptr;
+				out_next = nullptr;
+				result = facet.out(state, in_begin, in_begin + 1, in_next, out_begin, out_end, out_next);
+				if (result == codecvt_type::partial && in_next == in_begin + 1) {
+					in_begin = in_next;
+					out_begin = out_next;
+					continue;
+				} else {
+					break;
+				}
+			}
+		} else {
+			in_next = nullptr;
+			out_next = nullptr;
+			result = facet.out(state, in_begin, in_end, in_next, out_begin, out_end, out_next);
+		}
+		if (result == codecvt_type::partial || (result == codecvt_type::error && out_next == out_end)) {
+			out.resize(out.size() * 2);
+			in_begin = in_next;
+			out_begin = out.data() + (out_next - out_begin);
+			out_end = out.data() + out.size();
+			continue;
+		}
+		if (retry == 0) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				bool made_progress = true;
+				encode_locale_impl(std::wstring(L" ") + str, locale, replacement, 1, &made_progress);
+				if (!made_progress) {
+					return encode_locale_impl(str, locale, replacement, 2);
+				}
+			}
+		} else if (retry == 1) {
+			if (result == codecvt_type::error && in_next == in_begin && out_next == out_begin) {
+				*progress = false;
+			} else {
+				*progress = true;
+			}
+			return std::string();
+		}
+		if (result == codecvt_type::error) {
+			++in_next;
+			*out_next = replacement;
+			++out_next;
+		}
+		in_begin = in_next;
+		out_begin = out_next;
+	} while ((result == codecvt_type::error && in_next < in_end && out_next < out_end) || (retry == 2 && in_next < in_end));
+	return std::string(out.data(), out_next);
+}
+
+template <typename Tdststring>
+inline Tdststring encode_locale(const std::locale & locale, const mpt::widestring & src) {
+	if constexpr (std::is_same<Tdststring, std::string>::value) {
+		return encode_locale_impl(src, locale);
+	} else {
+		const std::string tmp = encode_locale_impl(src, locale);
+		return Tdststring(tmp.begin(), tmp.end());
+	}
+}
+
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+
+#if MPT_OS_WINDOWS
+template <typename Tdststring>
+inline Tdststring encode(UINT codepage, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_codepage<Tdststring>(codepage, src);
+}
+#endif // MPT_OS_WINDOWS
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <typename Tdststring>
+inline Tdststring encode(const std::locale & locale, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_locale<Tdststring>(src, locale);
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+template <typename Tdststring>
+inline Tdststring encode(const char32_t (&table)[256], const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+	return encode_8bit<Tdststring>(src, table);
+}
+
+template <typename Tdststring>
+inline Tdststring encode(common_encoding encoding, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return encode_codepage<Tdststring>(codepage_from_encoding(encoding), src);
+	}
+#endif
+	switch (encoding) {
+		case common_encoding::utf8:
+			return encode_utf8<Tdststring>(src);
+			break;
+		case common_encoding::ascii:
+			return encode_ascii<Tdststring>(src);
+			break;
+		case common_encoding::iso8859_1:
+			return encode_iso8859_1<Tdststring>(src);
+			break;
+		case common_encoding::iso8859_15:
+			return encode_8bit<Tdststring>(src, CharsetTableISO8859_15);
+			break;
+		case common_encoding::cp437:
+			return encode_8bit<Tdststring>(src, CharsetTableCP437);
+			break;
+		case common_encoding::cp850:
+			return encode_8bit<Tdststring>(src, CharsetTableCP850);
+			break;
+		case common_encoding::windows1252:
+			return encode_8bit<Tdststring>(src, CharsetTableWindows1252);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+}
+
+template <typename Tdststring>
+inline Tdststring encode(logical_encoding encoding, const mpt::widestring & src) {
+	static_assert(sizeof(typename Tdststring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tdststring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return encode_codepage<Tdststring>(codepage_from_encoding(encoding), src);
+	}
+#endif
+#if MPT_OS_DJGPP
+	switch (encoding) {
+		case logical_encoding::locale:
+			return encode<Tdststring>(djgpp_get_locale_encoding(), src);
+			break;
+		case logical_encoding::active_locale:
+			return encode<Tdststring>(djgpp_get_locale_encoding(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#elif !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+	switch (encoding) {
+		case logical_encoding::locale:
+			return encode_locale<Tdststring>(std::locale(""), src);
+			break;
+		case logical_encoding::active_locale:
+			return encode_locale<Tdststring>(std::locale(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#else
+	throw std::domain_error("unsupported encoding");
+#endif
+}
+
+#if MPT_OS_WINDOWS
+template <typename Tsrcstring>
+inline mpt::widestring decode(UINT codepage, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_codepage(codepage, src);
+}
+#endif // MPT_OS_WINDOWS
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <typename Tsrcstring>
+inline mpt::widestring decode(const std::locale & locale, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_locale(src, locale);
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(const char32_t (&table)[256], const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+	return decode_8bit(src, table);
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(common_encoding encoding, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return decode_codepage(codepage_from_encoding(encoding), src);
+	}
+#endif
+	switch (encoding) {
+		case common_encoding::utf8:
+			return decode_utf8(src);
+			break;
+		case common_encoding::ascii:
+			return decode_ascii(src);
+			break;
+		case common_encoding::iso8859_1:
+			return decode_iso8859_1(src);
+			break;
+		case common_encoding::iso8859_15:
+			return decode_8bit(src, CharsetTableISO8859_15);
+			break;
+		case common_encoding::cp437:
+			return decode_8bit(src, CharsetTableCP437);
+			break;
+		case common_encoding::cp850:
+			return decode_8bit(src, CharsetTableCP850);
+			break;
+		case common_encoding::windows1252:
+			return decode_8bit(src, CharsetTableWindows1252);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+}
+
+template <typename Tsrcstring>
+inline mpt::widestring decode(logical_encoding encoding, const Tsrcstring & src) {
+	static_assert(sizeof(typename Tsrcstring::value_type) == sizeof(char));
+	static_assert((std::is_same<typename Tsrcstring::value_type, char>::value));
+#if MPT_OS_WINDOWS
+	if (windows_has_encoding(encoding)) {
+		return decode_codepage(codepage_from_encoding(encoding), src);
+	}
+#endif
+#if MPT_OS_DJGPP
+	switch (encoding) {
+		case logical_encoding::locale:
+			return decode(djgpp_get_locale_encoding(), src);
+			break;
+		case logical_encoding::active_locale:
+			return decode(djgpp_get_locale_encoding(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#elif !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+	switch (encoding) {
+		case logical_encoding::locale:
+			return decode_locale(std::locale(""), src);
+			break;
+		case logical_encoding::active_locale:
+			return decode_locale(std::locale(), src);
+			break;
+	}
+	throw std::domain_error("unsupported encoding");
+#else
+	throw std::domain_error("unsupported encoding");
+#endif
+}
+
+
+
+inline bool is_utf8(const std::string & str) {
+	return (str == encode<std::string>(common_encoding::utf8, decode<std::string>(common_encoding::utf8, str)));
+}
+
+
+
+template <typename Tstring>
+struct string_converter {
+};
+
+template <logical_encoding encoding>
+struct string_converter<std::basic_string<char, logical_encoding_char_traits<encoding>>> {
+	using string_type = std::basic_string<char, logical_encoding_char_traits<encoding>>;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(encoding, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(encoding, src);
+	}
+};
+
+template <common_encoding encoding>
+struct string_converter<std::basic_string<char, common_encoding_char_traits<encoding>>> {
+	using string_type = std::basic_string<char, common_encoding_char_traits<encoding>>;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(encoding, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(encoding, src);
+	}
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct string_converter<std::wstring> {
+	using string_type = std::wstring;
+	static inline mpt::widestring decode(const string_type & src) {
+		return src;
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src;
+	}
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct string_converter<std::u8string> {
+	using string_type = std::u8string;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<string_type>(common_encoding::utf8, src);
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<string_type>(common_encoding::utf8, src);
+	}
+};
+#endif // C++10
+
+template <>
+struct string_converter<std::u16string> {
+	using string_type = std::u16string;
+	static inline mpt::widestring decode(const string_type & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char16_t)) {
+			return mpt::widestring(src.begin(), src.end());
+		} else {
+			return utf32_from_utf16<mpt::widestring, std::u16string>(src);
+		}
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char16_t)) {
+			return string_type(src.begin(), src.end());
+		} else {
+			return utf16_from_utf32<std::u16string, mpt::widestring>(src);
+		}
+	}
+};
+
+#if defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct string_converter<std::u32string> {
+	using string_type = std::u32string;
+	static inline mpt::widestring decode(const string_type & src) {
+		return src;
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src;
+	}
+};
+#else  // !MPT_COMPILER_QUIRK_NO_WCHAR
+template <>
+struct string_converter<std::u32string> {
+	using string_type = std::u32string;
+	static inline mpt::widestring decode(const string_type & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char32_t)) {
+			return mpt::widestring(src.begin(), src.end());
+		} else {
+			return utf16_from_utf32<mpt::widestring, std::u32string>(src);
+		}
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		if constexpr (sizeof(mpt::widechar) == sizeof(char32_t)) {
+			return string_type(src.begin(), src.end());
+		} else {
+			return utf32_from_utf16<std::u32string, mpt::widestring>(src);
+		}
+	}
+};
+#endif // MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct string_converter<CStringW> {
+	using string_type = CStringW;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::widestring(src.GetString());
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return src.c_str();
+	}
+};
+
+template <>
+struct string_converter<CStringA> {
+	using string_type = CStringA;
+	static inline mpt::widestring decode(const string_type & src) {
+		return mpt::decode<std::string>(mpt::logical_encoding::locale, std::string(src.GetString()));
+	}
+	static inline string_type encode(const mpt::widestring & src) {
+		return mpt::encode<std::string>(mpt::logical_encoding::locale, src).c_str();
+	}
+};
+
+#endif // MPT_DETECTED_MFC
+
+template <typename Tdststring, typename Tsrcstring, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(const Tsrcstring & src) {
+	if constexpr (std::is_same<Tdststring, typename mpt::make_string_type<Tsrcstring>::type>::value) {
+		return mpt::as_string(src);
+	} else {
+		return string_converter<Tdststring>::encode(string_converter<decltype(mpt::as_string(src))>::decode(mpt::as_string(src)));
+	}
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tencoding, std::enable_if_t<std::is_same<Tdststring, std::string>::value, bool> = true, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tencoding to, const Tsrcstring & src) {
+	return mpt::encode<Tdststring>(to, string_converter<decltype(mpt::as_string(src))>::decode(mpt::as_string(src)));
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tencoding, std::enable_if_t<std::is_same<typename mpt::make_string_type<Tsrcstring>::type, std::string>::value, bool> = true, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tencoding from, const Tsrcstring & src) {
+	return string_converter<Tdststring>::encode(mpt::decode<decltype(mpt::as_string(src))>(from, mpt::as_string(src)));
+}
+
+template <typename Tdststring, typename Tsrcstring, typename Tto, typename Tfrom, std::enable_if_t<mpt::is_string_type<typename mpt::make_string_type<Tsrcstring>::type>::value, bool> = true>
+inline Tdststring convert(Tto to, Tfrom from, const Tsrcstring & src) {
+	return mpt::encode<Tdststring>(to, mpt::decode<decltype(mpt::as_string(src))>(from, mpt::as_string(src)));
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_CONVERT_HPP

Property changes on: src/mpt/string/convert.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/convert_macros.hpp
===================================================================
--- src/mpt/string/convert_macros.hpp	(nonexistent)
+++ src/mpt/string/convert_macros.hpp	(working copy)
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_CONVERT_MACROS_HPP
+#define MPT_STRING_CONVERT_MACROS_HPP
+
+
+
+#include "mpt/string/types.hpp"
+#include "mpt/string/convert.hpp"
+
+#include <string>
+
+
+
+// The MPT_UTF8_STRING allows specifying UTF8 char arrays.
+// The resulting type is mpt::ustring and the construction might require runtime translation,
+// i.e. it is NOT generally available at compile time.
+// Use explicit UTF8 encoding,
+// i.e. U+00FC (LATIN SMALL LETTER U WITH DIAERESIS) would be written as "\xC3\xBC".
+#define MPT_UTF8_STRING(x) mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, std::string{x})
+
+
+
+#endif // MPT_STRING_CONVERT_MACROS_HPP

Property changes on: src/mpt/string/convert_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_floatingpoint.hpp
===================================================================
--- src/mpt/string/format_default_floatingpoint.hpp	(nonexistent)
+++ src/mpt/string/format_default_floatingpoint.hpp	(working copy)
@@ -0,0 +1,91 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP
+#define MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+
+#if MPT_MSVC_AT_LEAST(2019, 4) || MPT_GCC_AT_LEAST(11, 1, 0)
+#define MPT_FORMAT_CXX17_FLOAT 1
+#else
+#define MPT_FORMAT_CXX17_FLOAT 0
+#endif
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include "mpt/base/algorithm.hpp"
+#endif
+#include "mpt/string/convert.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include <charconv>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <iomanip>
+#include <ios>
+#include <limits>
+#include <locale>
+#include <sstream>
+#endif
+#include <string>
+#if MPT_FORMAT_CXX17_FLOAT
+#include <system_error>
+#endif
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_FORMAT_CXX17_FLOAT
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring to_chars_string(const T & x) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_chars_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+#endif
+
+
+#if !MPT_FORMAT_CXX17_FLOAT
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring to_stream_string(const T & x) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	s << std::setprecision(std::numeric_limits<T>::max_digits10) << x;
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_stream_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+#endif
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DETAULT_FLOATINGPOINT_HPP

Property changes on: src/mpt/string/format_default_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_formatter.hpp
===================================================================
--- src/mpt/string/format_default_formatter.hpp	(nonexistent)
+++ src/mpt/string/format_default_formatter.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP
+#define MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_default_floatingpoint.hpp"
+#include "mpt/string/format_default_integer.hpp"
+#include "mpt/string/format_default_string.hpp"
+
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+struct default_formatter {
+	template <typename Tstring, typename T>
+	static inline Tstring format(const T & value) {
+		using namespace mpt;
+		return format_value_default<Tstring>(value);
+	}
+};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_FORMATTER_HPP

Property changes on: src/mpt/string/format_default_formatter.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_integer.hpp
===================================================================
--- src/mpt/string/format_default_integer.hpp	(nonexistent)
+++ src/mpt/string/format_default_integer.hpp	(working copy)
@@ -0,0 +1,108 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP
+#define MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP
+
+
+#include "mpt/base/detect.hpp"
+
+#if 1
+#define MPT_FORMAT_CXX17_INT 1
+#else
+#define MPT_FORMAT_CXX17_INT 0
+#endif
+
+#if MPT_FORMAT_CXX17_INT
+#include "mpt/base/algorithm.hpp"
+#endif // MPT_FORMAT_CXX17_INT
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/format_helpers.hpp"
+
+#if MPT_FORMAT_CXX17_INT
+#include <charconv>
+#endif // MPT_FORMAT_CXX17_INT
+#if !MPT_FORMAT_CXX17_INT
+#include <ios>
+#include <locale>
+#include <sstream>
+#endif // !MPT_FORMAT_CXX17_INT
+#include <string>
+#if MPT_FORMAT_CXX17_INT
+#include <system_error>
+#endif // MPT_FORMAT_CXX17_INT
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+#if MPT_FORMAT_CXX17_INT
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring to_chars_string(const T & x) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		if constexpr (std::is_same<T, bool>::value) {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), static_cast<int>(x));
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		} else {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_chars_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+
+#endif // MPT_FORMAT_CXX17_INT
+
+
+#if !MPT_FORMAT_CXX17_INT
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring to_stream_string(const T & x) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	if constexpr (std::is_same<T, bool>::value) {
+		s << static_cast<int>(x);
+	} else if constexpr (mpt::is_character<T>::value) {
+		s << (x + 0); // force integral promotion
+	} else {
+		s << x;
+	}
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_value_default(const T & x) {
+	return mpt::convert<Tstring>(mpt::to_stream_string<typename mpt::select_format_string_type<Tstring>::type>(x));
+}
+
+#endif // !MPT_FORMAT_CXX17_INT
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_INTEGER_HPP

Property changes on: src/mpt/string/format_default_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_default_string.hpp
===================================================================
--- src/mpt/string/format_default_string.hpp	(nonexistent)
+++ src/mpt/string/format_default_string.hpp	(working copy)
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_DEFAULT_STRING_HPP
+#define MPT_STRING_FORMAT_DEFAULT_STRING_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tstring, typename T>
+inline auto format_value_default(const T & x) -> decltype(mpt::convert<Tstring>(x)) {
+	return mpt::convert<Tstring>(x);
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_DEFAULT_STRING_HPP

Property changes on: src/mpt/string/format_default_string.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_helpers.hpp
===================================================================
--- src/mpt/string/format_helpers.hpp	(nonexistent)
+++ src/mpt/string/format_helpers.hpp	(working copy)
@@ -0,0 +1,106 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_HELPERS_HPP
+#define MPT_STRING_FORMAT_HELPERS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <string>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tdststring, typename Tsrcstring>
+inline Tdststring convert_formatted_simple(const Tsrcstring & src) {
+	if constexpr (std::is_same<Tdststring, Tsrcstring>::value) {
+		return src;
+	} else {
+		Tdststring dst;
+		dst.reserve(src.length());
+		for (std::size_t i = 0; i < src.length(); ++i) {
+			dst.push_back(mpt::unsafe_char_convert<typename Tdststring::value_type>(src[i]));
+		}
+		return dst;
+	}
+}
+
+
+template <typename Tchar>
+struct select_format_char_type {
+	using type = char;
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct select_format_char_type<wchar_t> {
+	using type = wchar_t;
+};
+#if MPT_USTRING_MODE_WIDE
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct select_format_char_type<char8_t> {
+	using type = wchar_t;
+};
+#endif // C++20
+template <>
+struct select_format_char_type<char16_t> {
+	using type = wchar_t;
+};
+template <>
+struct select_format_char_type<char32_t> {
+	using type = wchar_t;
+};
+#endif // MPT_USTRING_MODE_WIDE
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+template <typename Tstring>
+struct select_format_string_type {
+	using type = mpt::ustring;
+};
+
+template <>
+struct select_format_string_type<std::string> {
+	using type = std::string;
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct select_format_string_type<std::wstring> {
+	using type = std::wstring;
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct select_format_string_type<std::u8string> {
+	using type = std::u8string;
+};
+#endif // C++20
+
+template <>
+struct select_format_string_type<std::u16string> {
+	using type = std::u16string;
+};
+
+template <>
+struct select_format_string_type<std::u32string> {
+	using type = std::u32string;
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_HELPERS_HPP

Property changes on: src/mpt/string/format_helpers.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_message.hpp
===================================================================
--- src/mpt/string/format_message.hpp	(nonexistent)
+++ src/mpt/string/format_message.hpp	(working copy)
@@ -0,0 +1,334 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_MESSAGE_HPP
+#define MPT_STRING_FORMAT_MESSAGE_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/span.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <array>
+#include <stdexcept>
+#include <utility>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+class format_message_syntax_error
+	: public std::domain_error {
+public:
+	format_message_syntax_error()
+		: std::domain_error("format string syntax error") {
+		return;
+	}
+};
+
+template <typename Tformatter, typename Tformat>
+class message_formatter {
+
+public:
+	using Tstring = typename mpt::make_string_type<Tformat>::type;
+
+private:
+	Tstring format;
+
+private:
+	MPT_NOINLINE Tstring do_format(const mpt::span<const Tstring> vals) const {
+		using traits = typename mpt::string_traits<Tstring>;
+		using char_type = typename traits::char_type;
+		using size_type = typename traits::size_type;
+		Tstring result;
+		const size_type len = traits::length(format);
+		traits::reserve(result, len);
+		std::size_t max_arg = 0;
+		std::size_t args = 0;
+		bool success = true;
+		enum class state : int
+		{
+			error = -1,
+			text = 0,
+			open_seen = 1,
+			number_seen = 2,
+			close_seen = 3,
+		};
+		state state = state::text;
+		bool numbered_args = false;
+		bool unnumbered_args = false;
+		std::size_t last_arg = 0;
+		std::size_t this_arg = 0;
+		std::size_t current_arg = 0;
+		for (size_type pos = 0; pos != len; ++pos) {
+			char_type c = format[pos];
+			switch (state) {
+				case state::text:
+					if (c == char_type('{')) {
+						state = state::open_seen;
+					} else if (c == char_type('}')) {
+						state = state::close_seen;
+					} else {
+						state = state::text;
+						traits::append(result, 1, c); // output c here
+					}
+					break;
+				case state::open_seen:
+					if (c == char_type('{')) {
+						state = state::text;
+						traits::append(result, 1, char_type('{')); // output { here
+					} else if (c == char_type('}')) {
+						state = state::text;
+						unnumbered_args = true;
+						last_arg++;
+						this_arg = last_arg;
+						{ // output this_arg here
+							const std::size_t n = this_arg - 1;
+							if (n < std::size(vals)) {
+								traits::append(result, vals[n]);
+							}
+						}
+						if (this_arg > max_arg) {
+							max_arg = this_arg;
+						}
+						args += 1;
+					} else if (char_type('0') <= c && c <= char_type('9')) {
+						state = state::number_seen;
+						numbered_args = true;
+						current_arg = c - char_type('0');
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::number_seen:
+					if (c == char_type('{')) {
+						state = state::error;
+					} else if (c == char_type('}')) {
+						state = state::text;
+						this_arg = current_arg + 1;
+						{ // output this_arg here
+							const std::size_t n = this_arg - 1;
+							if (n < std::size(vals)) {
+								traits::append(result, vals[n]);
+							}
+						}
+						if (this_arg > max_arg) {
+							max_arg = this_arg;
+						}
+						args += 1;
+					} else if (char_type('0') <= c && c <= char_type('9')) {
+						state = state::number_seen;
+						numbered_args = true;
+						current_arg = (current_arg * 10) + (c - char_type('0'));
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::close_seen:
+					if (c == char_type('{')) {
+						state = state::error;
+					} else if (c == char_type('}')) {
+						state = state::text;
+						traits::append(result, 1, char_type('}')); // output } here
+					} else {
+						state = state::error;
+					}
+					break;
+				case state::error:
+					state = state::error;
+					break;
+			}
+		}
+		if (state == state::error) {
+			success = false;
+		}
+		if (state != state::text) {
+			success = false;
+		}
+		if (numbered_args && unnumbered_args) {
+			success = false;
+		}
+		if (!success) {
+			throw format_message_syntax_error();
+		}
+		return result;
+	}
+
+public:
+	MPT_FORCEINLINE message_formatter(Tstring format_)
+		: format(std::move(format_)) {
+	}
+
+public:
+	template <typename... Ts>
+	MPT_NOINLINE Tstring operator()(Ts &&... xs) const {
+		const std::array<Tstring, sizeof...(xs)> vals{{Tformatter::template format<Tstring>(std::forward<Ts>(xs))...}};
+		return do_format(mpt::as_span(vals));
+	}
+
+}; // struct message_formatter<Tformat>
+
+
+template <typename Tformatter, std::ptrdiff_t N, typename Tchar, typename Tstring>
+class message_formatter_counted {
+
+private:
+	message_formatter<Tformatter, Tstring> formatter;
+
+public:
+	template <std::size_t literal_length>
+	inline message_formatter_counted(const Tchar (&format)[literal_length])
+		: formatter(Tstring(format)) {
+		return;
+	}
+
+public:
+	template <typename... Ts>
+	inline Tstring operator()(Ts &&... xs) const {
+		static_assert(static_cast<std::ptrdiff_t>(sizeof...(xs)) == N);
+		return formatter(std::forward<Ts>(xs)...);
+	}
+
+}; // struct message_formatter_counted<Tformat>
+
+
+template <typename Tchar>
+MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count_impl(const Tchar * const format, const std::size_t len) {
+	std::size_t max_arg = 0;
+	std::size_t args = 0;
+	bool success = true;
+	enum class state : int
+	{
+		error = -1,
+		text = 0,
+		open_seen = 1,
+		number_seen = 2,
+		close_seen = 3,
+	};
+	state state = state::text;
+	bool numbered_args = false;
+	bool unnumbered_args = false;
+	std::size_t last_arg = 0;
+	std::size_t this_arg = 0;
+	std::size_t current_arg = 0;
+	for (std::size_t pos = 0; pos != len; ++pos) {
+		Tchar c = format[pos];
+		switch (state) {
+			case state::text:
+				if (c == Tchar('{')) {
+					state = state::open_seen;
+				} else if (c == Tchar('}')) {
+					state = state::close_seen;
+				} else {
+					state = state::text;
+					// output c here
+				}
+				break;
+			case state::open_seen:
+				if (c == Tchar('{')) {
+					state = state::text;
+					// output { here
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					unnumbered_args = true;
+					last_arg++;
+					this_arg = last_arg;
+					// output this_arg here
+					if (this_arg > max_arg)
+					{
+						max_arg = this_arg;
+					}
+					args += 1;
+				} else if (Tchar('0') <= c && c <= Tchar('9')) {
+					state = state::number_seen;
+					numbered_args = true;
+					current_arg = c - Tchar('0');
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::number_seen:
+				if (c == Tchar('{')) {
+					state = state::error;
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					this_arg = current_arg + 1;
+					// output this_arg here
+					if (this_arg > max_arg) {
+						max_arg = this_arg;
+					}
+					args += 1;
+				} else if (Tchar('0') <= c && c <= Tchar('9')) {
+					state = state::number_seen;
+					numbered_args = true;
+					current_arg = (current_arg * 10) + (c - Tchar('0'));
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::close_seen:
+				if (c == Tchar('{')) {
+					state = state::error;
+				} else if (c == Tchar('}')) {
+					state = state::text;
+					// output } here
+				} else {
+					state = state::error;
+				}
+				break;
+			case state::error:
+				state = state::error;
+				break;
+		}
+	}
+	if (state == state::error) {
+		success = false;
+	}
+	if (state != state::text) {
+		success = false;
+	}
+	if (numbered_args && unnumbered_args) {
+		success = false;
+	}
+	if (!success) {
+		throw format_message_syntax_error();
+	}
+	if (max_arg != args) {
+		throw format_message_syntax_error();
+	}
+	return max_arg;
+}
+
+
+template <typename Tchar, std::size_t literal_length>
+MPT_CONSTEXPRINLINE std::ptrdiff_t parse_format_string_argument_count(const Tchar (&format)[literal_length]) {
+	return parse_format_string_argument_count_impl(format, literal_length - 1);
+}
+
+
+template <typename Tformatter, std::size_t args, typename Tchar, std::size_t N>
+inline auto format_message(const Tchar (&format)[N]) {
+	using Tstring = typename mpt::make_string_type<const Tchar *>::type;
+	return message_formatter_counted<Tformatter, args, Tchar, Tstring>(format);
+}
+
+template <typename Tformatter, std::size_t args, typename Tstring, typename Tchar, std::size_t N>
+inline auto format_message_typed(const Tchar (&format)[N]) {
+	return message_formatter_counted<Tformatter, args, Tchar, Tstring>(format);
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_MESSAGE_HPP

Property changes on: src/mpt/string/format_message.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_message_macros.hpp
===================================================================
--- src/mpt/string/format_message_macros.hpp	(nonexistent)
+++ src/mpt/string/format_message_macros.hpp	(working copy)
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_MESSAGE_MACROS_HPP
+#define MPT_STRING_FORMAT_MESSAGE_MACROS_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/detect/mfc.hpp"
+#include "mpt/string/format_default_formatter.hpp"
+#include "mpt/string/format_message.hpp"
+
+
+
+#define MPT_FORMAT_MESSAGE(f) mpt::format_message<mpt::default_formatter, mpt::parse_format_string_argument_count(f)>(f)
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+#define MPT_WFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(L##f), std::wstring>(L##f)
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#define MPT_UFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(MPT_ULITERAL(f)), mpt::ustring>(MPT_ULITERAL(f))
+
+#define MPT_LFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(f), mpt::lstring>(f)
+
+#if MPT_OS_WINDOWS
+#define MPT_TFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(TEXT(f)), mpt::tstring>(TEXT(f))
+#endif
+
+#if MPT_DETECTED_MFC
+#define MPT_CWFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(L##f), CStringW>(L##f)
+#define MPT_CAFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(f), CStringA>(f)
+#define MPT_CFORMAT_MESSAGE(f) mpt::format_message_typed<mpt::default_formatter, mpt::parse_format_string_argument_count(TEXT(f)), CString>(TEXT(f))
+#endif // MPT_DETECTED_MFC
+
+
+
+#endif // MPT_STRING_FORMAT_MESSAGE_MACROS_HPP

Property changes on: src/mpt/string/format_message_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple.hpp
===================================================================
--- src/mpt/string/format_simple.hpp	(nonexistent)
+++ src/mpt/string/format_simple.hpp	(working copy)
@@ -0,0 +1,166 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_HPP
+#define MPT_STRING_FORMAT_SIMPLE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/pointer.hpp"
+#include "mpt/string/format_default_formatter.hpp"
+#include "mpt/string/format_simple_floatingpoint.hpp"
+#include "mpt/string/format_simple_integer.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+#include "mpt/string/utility.hpp"
+
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+template <typename Tstring>
+struct format : format_simple_base {
+
+	template <typename T>
+	static inline Tstring val(const T & x) {
+		return mpt::default_formatter::format<Tstring>(x);
+	}
+
+	template <typename T>
+	static inline Tstring fmt(const T & x, const format_simple_spec & f) {
+		return mpt::format_simple<Tstring>(x, f);
+	}
+
+	template <typename T>
+	static inline Tstring dec(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillOff());
+	}
+	template <int width, typename T>
+	static inline Tstring dec0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillNul().Width(width));
+	}
+
+	template <typename T>
+	static inline Tstring dec(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillOff().Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring dec0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseDec().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+
+	template <typename T>
+	static inline Tstring hex(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillOff());
+	}
+	template <typename T>
+	static inline Tstring HEX(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillOff());
+	}
+	template <int width, typename T>
+	static inline Tstring hex0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillNul().Width(width));
+	}
+	template <int width, typename T>
+	static inline Tstring HEX0(const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillNul().Width(width));
+	}
+
+	template <typename T>
+	static inline Tstring hex(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillOff().Group(g).GroupSep(s));
+	}
+	template <typename T>
+	static inline Tstring HEX(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillOff().Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring hex0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseLow().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+	template <int width, typename T>
+	static inline Tstring HEX0(unsigned int g, char s, const T & x) {
+		static_assert(std::numeric_limits<T>::is_integer);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().BaseHex().CaseUpp().FillNul().Width(width).Group(g).GroupSep(s));
+	}
+
+	template <typename T>
+	static inline Tstring flt(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaNrm().FillOff().Precision(precision));
+	}
+	template <typename T>
+	static inline Tstring fix(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaFix().FillOff().Precision(precision));
+	}
+	template <typename T>
+	static inline Tstring sci(const T & x, int precision = -1) {
+		static_assert(std::is_floating_point<T>::value);
+		return mpt::format_simple<Tstring>(x, format_simple_spec().NotaSci().FillOff().Precision(precision));
+	}
+
+	template <typename T>
+	static inline Tstring ptr(const T & x) {
+		static_assert(std::is_pointer<T>::value || std::is_same<T, std::uintptr_t>::value || std::is_same<T, std::intptr_t>::value, "");
+		return hex0<mpt::pointer_size * 2>(mpt::pointer_cast<const std::uintptr_t>(x));
+	}
+	template <typename T>
+	static inline Tstring PTR(const T & x) {
+		static_assert(std::is_pointer<T>::value || std::is_same<T, std::uintptr_t>::value || std::is_same<T, std::intptr_t>::value, "");
+		return HEX0<mpt::pointer_size * 2>(mpt::pointer_cast<const std::uintptr_t>(x));
+	}
+
+	static inline Tstring pad_left(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return traits::pad(str, width, 0);
+	}
+	static inline Tstring pad_right(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return traits::pad(str, 0, width);
+	}
+	static inline Tstring left(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, 0, width - traits::length(str)) : str;
+	}
+	static inline Tstring right(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, width - traits::length(str), 0) : str;
+	}
+	static inline Tstring center(std::size_t width_, const Tstring & str) {
+		typedef mpt::string_traits<Tstring> traits;
+		typename traits::size_type width = static_cast<typename traits::size_type>(width_);
+		return (traits::length(str) < width) ? traits::pad(str, (width - traits::length(str)) / 2, (width - traits::length(str) + 1) / 2) : str;
+	}
+
+}; // struct format
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_HPP

Property changes on: src/mpt/string/format_simple.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_floatingpoint.hpp
===================================================================
--- src/mpt/string/format_simple_floatingpoint.hpp	(nonexistent)
+++ src/mpt/string/format_simple_floatingpoint.hpp	(working copy)
@@ -0,0 +1,242 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP
+#define MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP
+
+
+
+#include "mpt/string/format_default_floatingpoint.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include "mpt/base/algorithm.hpp"
+#endif
+#include "mpt/string/convert.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+
+#if MPT_FORMAT_CXX17_FLOAT
+#include <charconv>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <iomanip>
+#include <ios>
+#endif
+#if MPT_FORMAT_CXX17_FLOAT
+#include <iterator>
+#endif
+#if !MPT_FORMAT_CXX17_FLOAT
+#include <limits>
+#include <locale>
+#include <sstream>
+#endif
+#include <string>
+#if MPT_FORMAT_CXX17_FLOAT
+#include <system_error>
+#endif
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_FORMAT_CXX17_FLOAT
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_to_chars(const T & x, std::chars_format fmt) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, fmt);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_to_chars(const T & x, std::chars_format fmt, int precision) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, fmt, precision);
+		if (result.ec != std::errc{}) {
+			str.resize(mpt::exponential_grow(str.size()), '\0');
+		} else {
+			str.resize(result.ptr - str.data());
+			done = true;
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+template <typename Tstring>
+inline Tstring format_simple_floatingpoint_postprocess_width(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	if (f & format_simple_base::FillNul) {
+		auto pos = str.begin();
+		if (str.length() > 0) {
+			if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+')) {
+				pos++;
+				width++;
+			} else if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')) {
+				pos++;
+				width++;
+			}
+		}
+		if (str.length() - std::distance(str.begin(), pos) < width) {
+			str.insert(pos, width - str.length() - std::distance(str.begin(), pos), '0');
+		}
+	} else {
+		if (str.length() < width) {
+			str.insert(0, width - str.length(), ' ');
+		}
+	}
+	return str;
+}
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & f) {
+	using format_string_type = typename mpt::select_format_string_type<Tstring>::type;
+	if (f.GetPrecision() != -1) {
+		if (f.GetFlags() & format_simple_base::NotaSci) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::scientific, f.GetPrecision()), f));
+		} else if (f.GetFlags() & format_simple_base::NotaFix) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::fixed, f.GetPrecision()), f));
+		} else {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::general, f.GetPrecision()), f));
+		}
+	} else {
+		if (f.GetFlags() & format_simple_base::NotaSci) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::scientific), f));
+		} else if (f.GetFlags() & format_simple_base::NotaFix) {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::fixed), f));
+		} else {
+			return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_postprocess_width(format_simple_floatingpoint_to_chars<format_string_type>(x, std::chars_format::general), f));
+		}
+	}
+}
+
+
+#else // !MPT_FORMAT_CXX17_FLOAT
+
+
+template <typename Tchar>
+struct NumPunct : std::numpunct<Tchar> {
+private:
+	unsigned int group;
+	char sep;
+
+public:
+	NumPunct(unsigned int g, char s)
+		: group(g)
+		, sep(s) { }
+	std::string do_grouping() const override {
+		return std::string(1, static_cast<char>(group));
+	}
+	Tchar do_thousands_sep() const override {
+		return static_cast<Tchar>(sep);
+	}
+};
+
+template <typename Tostream, typename T>
+inline void format_simple_floatingpoint_apply_stream_format(Tostream & o, const format_simple_spec & format, const T &) {
+	if (format.GetGroup() > 0)
+	{
+		o.imbue(std::locale(o.getloc(), new NumPunct<typename Tostream::char_type>(format.GetGroup(), format.GetGroupSep())));
+	}
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	int precision = format.GetPrecision();
+	if (precision != -1 && width != 0 && !(f & format_simple_base::NotaFix) && !(f & format_simple_base::NotaSci))
+	{
+		// fixup:
+		// precision behaves differently from .#
+		// avoid default format when precision and width are set
+		f &= ~format_simple_base::NotaNrm;
+		f |= format_simple_base::NotaFix;
+	}
+	if (f & format_simple_base::BaseDec) {
+		o << std::dec;
+	} else if (f & format_simple_base::BaseHex) {
+		o << std::hex;
+	}
+	if (f & format_simple_base::NotaNrm) { /*nothing*/
+	} else if (f & format_simple_base::NotaFix) {
+		o << std::setiosflags(std::ios::fixed);
+	} else if (f & format_simple_base::NotaSci) {
+		o << std::setiosflags(std::ios::scientific);
+	}
+	if (f & format_simple_base::CaseLow) {
+		o << std::nouppercase;
+	} else if (f & format_simple_base::CaseUpp) {
+		o << std::uppercase;
+	}
+	if (f & format_simple_base::FillOff) { /* nothing */
+	} else if (f & format_simple_base::FillNul) {
+		o << std::setw(width) << std::setfill(typename Tostream::char_type('0'));
+	}
+	if (precision != -1)
+	{
+		o << std::setprecision(precision);
+	} else
+	{
+		if constexpr (std::is_floating_point<T>::value)
+		{
+			if (f & format_simple_base::NotaNrm)
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10);
+			} else if (f & format_simple_base::NotaFix)
+			{
+				o << std::setprecision(std::numeric_limits<T>::digits10);
+			} else if (f & format_simple_base::NotaSci)
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10 - 1);
+			} else
+			{
+				o << std::setprecision(std::numeric_limits<T>::max_digits10);
+			}
+		}
+	}
+}
+
+
+template <typename Tstring, typename T>
+inline Tstring format_simple_floatingpoint_stream(const T & x, const format_simple_spec & f) {
+	using stream_char_type = typename mpt::select_format_char_type<typename Tstring::value_type>::type;
+	std::basic_ostringstream<stream_char_type> s;
+	s.imbue(std::locale::classic());
+	mpt::format_simple_floatingpoint_apply_stream_format(s, f, x);
+	s << x;
+	return mpt::convert_formatted_simple<Tstring>(s.str());
+}
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_floating_point<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & format) {
+	return mpt::convert<Tstring>(mpt::format_simple_floatingpoint_stream<typename mpt::select_format_string_type<Tstring>::type>(x, format));
+}
+
+
+
+#endif // MPT_FORMAT_CXX17_FLOAT
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_FLOATINGPOINT_HPP

Property changes on: src/mpt/string/format_simple_floatingpoint.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_integer.hpp
===================================================================
--- src/mpt/string/format_simple_integer.hpp	(nonexistent)
+++ src/mpt/string/format_simple_integer.hpp	(working copy)
@@ -0,0 +1,134 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP
+#define MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP
+
+
+#include "mpt/base/algorithm.hpp"
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_helpers.hpp"
+#include "mpt/string/format_simple_spec.hpp"
+
+#include <charconv>
+#include <string>
+#include <system_error>
+#include <type_traits>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_simple_integer_to_chars(const T & x, int base) {
+	std::string str(1, '\0');
+	bool done = false;
+	while (!done) {
+		if constexpr (std::is_same<T, bool>::value) {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), static_cast<int>(x), base);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		} else {
+			std::to_chars_result result = std::to_chars(str.data(), str.data() + str.size(), x, base);
+			if (result.ec != std::errc{}) {
+				str.resize(mpt::exponential_grow(str.size()), '\0');
+			} else {
+				str.resize(result.ptr - str.data());
+				done = true;
+			}
+		}
+	}
+	return mpt::convert_formatted_simple<Tstring>(str);
+}
+
+
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_case(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	if (f & format_simple_base::CaseUpp) {
+		for (auto & c : str) {
+			if (mpt::unsafe_char_convert<typename Tstring::value_type>('a') <= c && c <= mpt::unsafe_char_convert<typename Tstring::value_type>('z')) {
+				c -= mpt::unsafe_char_convert<typename Tstring::value_type>('a') - mpt::unsafe_char_convert<typename Tstring::value_type>('A');
+			}
+		}
+	}
+	return str;
+}
+
+
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_digits(Tstring str, const format_simple_spec & format) {
+	format_simple_flags f = format.GetFlags();
+	std::size_t width = format.GetWidth();
+	if (f & format_simple_base::FillNul) {
+		auto pos = str.begin();
+		if (str.length() > 0) {
+			if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+')) {
+				pos++;
+				width++;
+			} else if (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')) {
+				pos++;
+				width++;
+			}
+		}
+		if (str.length() < width) {
+			str.insert(pos, width - str.length(), mpt::unsafe_char_convert<typename Tstring::value_type>('0'));
+		}
+	}
+	return str;
+}
+
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4723) // potential divide by 0
+#endif                          // MPT_COMPILER_MSVC
+template <typename Tstring>
+inline Tstring format_simple_integer_postprocess_group(Tstring str, const format_simple_spec & format) {
+	if (format.GetGroup() > 0) {
+		const unsigned int groupSize = format.GetGroup();
+		const char groupSep = format.GetGroupSep();
+		std::size_t len = str.length();
+		for (std::size_t n = 0; n < len; ++n) {
+			if (n > 0 && (n % groupSize) == 0) {
+				if (!(n == (len - 1) && (str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('+') || str[0] == mpt::unsafe_char_convert<typename Tstring::value_type>('-')))) {
+					str.insert(str.begin() + (len - n), 1, mpt::unsafe_char_convert<typename Tstring::value_type>(groupSep));
+				}
+			}
+		}
+	}
+	return str;
+}
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif // MPT_COMPILER_MSVC
+
+
+template <typename Tstring, typename T, std::enable_if_t<std::is_integral<T>::value, bool> = true>
+inline Tstring format_simple(const T & x, const format_simple_spec & format) {
+	int base = 10;
+	if (format.GetFlags() & format_simple_base::BaseDec) {
+		base = 10;
+	}
+	if (format.GetFlags() & format_simple_base::BaseHex) {
+		base = 16;
+	}
+	using format_string_type = typename mpt::select_format_string_type<Tstring>::type;
+	return mpt::convert<Tstring>(mpt::format_simple_integer_postprocess_group(mpt::format_simple_integer_postprocess_digits(mpt::format_simple_integer_postprocess_case(mpt::format_simple_integer_to_chars<format_string_type>(x, base), format), format), format));
+}
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_INTEGER_HPP

Property changes on: src/mpt/string/format_simple_integer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/format_simple_spec.hpp
===================================================================
--- src/mpt/string/format_simple_spec.hpp	(nonexistent)
+++ src/mpt/string/format_simple_spec.hpp	(working copy)
@@ -0,0 +1,218 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_FORMAT_SIMPLE_SPEC_HPP
+#define MPT_STRING_FORMAT_SIMPLE_SPEC_HPP
+
+
+
+#include "mpt/base/macros.hpp"
+#include "mpt/base/namespace.hpp"
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+struct format_simple_base {
+
+	enum FormatFlagsEnum
+	{
+		BaseDec = 0x0001, // base 10 (integers only)        // int+float
+		BaseHex = 0x0002, // base 16 (integers only)        // int+float
+		CaseLow = 0x0010, // lower case hex digits          // int+float
+		CaseUpp = 0x0020, // upper case hex digits          // int+float
+		FillOff = 0x0100, // do not fill up width           // int+float
+		FillNul = 0x0400, // fill up width with zeros       // int+float
+		NotaNrm = 0x1000, // float: normal/default notation // float
+		NotaFix = 0x2000, // float: fixed point notation    // float
+		NotaSci = 0x4000, // float: scientific notation     // float
+	};
+
+}; // struct format_simple_base
+
+using format_simple_flags = unsigned int;
+
+static_assert(sizeof(format_simple_flags) >= sizeof(format_simple_base::FormatFlagsEnum));
+
+
+class format_simple_spec {
+private:
+	format_simple_flags flags;
+	std::size_t width;  // int+float
+	int precision;      // float
+	unsigned int group; // int
+	char group_sep;     // int
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec() noexcept
+		: flags(0), width(0), precision(-1), group(0), group_sep(',') { }
+	MPT_CONSTEXPRINLINE format_simple_flags GetFlags() const noexcept {
+		return flags;
+	}
+	MPT_CONSTEXPRINLINE std::size_t GetWidth() const noexcept {
+		return width;
+	}
+	MPT_CONSTEXPRINLINE int GetPrecision() const noexcept {
+		return precision;
+	}
+	MPT_CONSTEXPRINLINE unsigned int GetGroup() const noexcept {
+		return group;
+	}
+	MPT_CONSTEXPRINLINE char GetGroupSep() const noexcept {
+		return group_sep;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetFlags(format_simple_flags f) noexcept {
+		flags = f;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetWidth(std::size_t w) noexcept {
+		width = w;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetPrecision(int p) noexcept {
+		precision = p;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetGroup(unsigned int g) noexcept {
+		group = g;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & SetGroupSep(char s) noexcept {
+		group_sep = s;
+		return *this;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & BaseDec() noexcept {
+		flags &= ~(format_simple_base::BaseDec | format_simple_base::BaseHex);
+		flags |= format_simple_base::BaseDec;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & BaseHex() noexcept {
+		flags &= ~(format_simple_base::BaseDec | format_simple_base::BaseHex);
+		flags |= format_simple_base::BaseHex;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & CaseLow() noexcept {
+		flags &= ~(format_simple_base::CaseLow | format_simple_base::CaseUpp);
+		flags |= format_simple_base::CaseLow;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & CaseUpp() noexcept {
+		flags &= ~(format_simple_base::CaseLow | format_simple_base::CaseUpp);
+		flags |= format_simple_base::CaseUpp;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillOff() noexcept {
+		flags &= ~(format_simple_base::FillOff | format_simple_base::FillNul);
+		flags |= format_simple_base::FillOff;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillNul() noexcept {
+		flags &= ~(format_simple_base::FillOff | format_simple_base::FillNul);
+		flags |= format_simple_base::FillNul;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaNrm() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaNrm;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaFix() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaFix;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & NotaSci() noexcept {
+		flags &= ~(format_simple_base::NotaNrm | format_simple_base::NotaFix | format_simple_base::NotaSci);
+		flags |= format_simple_base::NotaSci;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Width(std::size_t w) noexcept {
+		width = w;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Prec(int p) noexcept {
+		precision = p;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Group(unsigned int g) noexcept {
+		group = g;
+		return *this;
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & GroupSep(char s) noexcept {
+		group_sep = s;
+		return *this;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & Dec() noexcept {
+		return BaseDec();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Hex() noexcept {
+		return BaseHex();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Low() noexcept {
+		return CaseLow();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Upp() noexcept {
+		return CaseUpp();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Off() noexcept {
+		return FillOff();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Nul() noexcept {
+		return FillNul();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Nrm() noexcept {
+		return NotaNrm();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Fix() noexcept {
+		return NotaFix();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Sci() noexcept {
+		return NotaSci();
+	}
+
+public:
+	MPT_CONSTEXPRINLINE format_simple_spec & Decimal() noexcept {
+		return BaseDec();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Hexadecimal() noexcept {
+		return BaseHex();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Lower() noexcept {
+		return CaseLow();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Upper() noexcept {
+		return CaseUpp();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillNone() noexcept {
+		return FillOff();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FillZero() noexcept {
+		return FillNul();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatNormal() noexcept {
+		return NotaNrm();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatFixed() noexcept {
+		return NotaFix();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & FloatScientific() noexcept {
+		return NotaSci();
+	}
+	MPT_CONSTEXPRINLINE format_simple_spec & Precision(int p) noexcept {
+		return Prec(p);
+	}
+};
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_FORMAT_SIMPLE_SPEC_HPP

Property changes on: src/mpt/string/format_simple_spec.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/parse.hpp
===================================================================
--- src/mpt/string/parse.hpp	(nonexistent)
+++ src/mpt/string/parse.hpp	(working copy)
@@ -0,0 +1,107 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_PARSE_HPP
+#define MPT_STRING_PARSE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+
+#include <ios>
+#include <locale>
+#include <sstream>
+#include <string>
+#include <type_traits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline std::string parse_as_internal_string_type(const std::string & s) {
+	return s;
+}
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+inline std::wstring parse_as_internal_string_type(const std::wstring & s) {
+	return s;
+}
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_USTRING_MODE_WIDE
+template <typename Tstring>
+inline std::wstring parse_as_internal_string_type(const Tstring & s) {
+	return mpt::convert<std::wstring>(s);
+}
+#else  // !MPT_USTRING_MODE_WIDE
+template <typename Tstring>
+inline std::string parse_as_internal_string_type(const Tstring & s) {
+	return mpt::convert<std::string>(mpt::common_encoding::utf8, s);
+}
+#endif // MPT_USTRING_MODE_WIDE
+
+
+template <typename T, typename Tstring>
+inline T ConvertStringTo(const Tstring & str) {
+	std::basic_istringstream<typename decltype(mpt::parse_as_internal_string_type(mpt::as_string(str)))::value_type> stream(mpt::parse_as_internal_string_type(mpt::as_string(str)));
+	stream.imbue(std::locale::classic());
+	T value;
+	if constexpr (std::is_same<T, signed char>::value) {
+		signed int tmp;
+		if (!(stream >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else if constexpr (std::is_same<T, unsigned char>::value) {
+		unsigned int tmp;
+		if (!(stream >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else {
+		if (!(stream >> value)) {
+			return T{};
+		}
+	}
+	return value;
+}
+
+
+template <typename T, typename Tstring>
+inline T ConvertHexStringTo(const Tstring & str) {
+	std::basic_istringstream<typename decltype(mpt::parse_as_internal_string_type(mpt::as_string(str)))::value_type> stream(mpt::parse_as_internal_string_type(mpt::as_string(str)));
+	stream.imbue(std::locale::classic());
+	T value;
+	if constexpr (std::is_same<T, signed char>::value) {
+		signed int tmp;
+		if (!(stream >> std::hex >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else if constexpr (std::is_same<T, unsigned char>::value) {
+		unsigned int tmp;
+		if (!(stream >> std::hex >> tmp)) {
+			return T{};
+		}
+		value = static_cast<T>(tmp);
+	} else {
+		if (!(stream >> std::hex >> value)) {
+			return T{};
+		}
+	}
+	return value;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_PARSE_HPP

Property changes on: src/mpt/string/parse.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_buffer.hpp
===================================================================
--- src/mpt/string/tests/tests_string_buffer.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_buffer.hpp	(working copy)
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_BUFFER_HPP
+#define MPT_STRING_TESTS_STRING_BUFFER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/buffer.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_buffer{
+	"mpt/string/buffer",
+	[](mpt::test::context & context) {
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteAutoBuf(buf) = std::string("foobar");
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			char foobar[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'};
+			mpt::WriteTypedBuf<std::string>(buf) = (char *)foobar;
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteTypedBuf<std::string>(buf) = (const char *)"foobar";
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteTypedBuf<std::string>(buf) = "foobar";
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			const char buf[4] = {'f', 'o', 'o', 'b'};
+			std::string foo = mpt::ReadAutoBuf(buf);
+			MPT_TEST_EXPECT_EQUAL(foo, std::string("foob"));
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_BUFFER_HPP

Property changes on: src/mpt/string/tests/tests_string_buffer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_convert.hpp
===================================================================
--- src/mpt/string/tests/tests_string_convert.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_convert.hpp	(working copy)
@@ -0,0 +1,222 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_CONVERT_HPP
+#define MPT_STRING_TESTS_STRING_CONVERT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/convert_macros.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_convert{
+	"mpt/string/convert",
+	[](mpt::test::context & context) {
+		// MPT_UTF8_STRING version
+
+		// Charset conversions (basic sanity checks)
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "a"), MPT_USTRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "a"), MPT_USTRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "a"), MPT_USTRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "a"), MPT_USTRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "a"), MPT_UTF8_STRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "a"), MPT_UTF8_STRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "a"), MPT_UTF8_STRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "a"), MPT_UTF8_STRING("a"));
+
+#if MPT_OS_EMSCRIPTEN
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("\xe2\x8c\x82")), "\xe2\x8c\x82");
+#endif // MPT_OS_EMSCRIPTEN
+
+		// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
+		// We test german umlaut-a (U+00E4) (\xC3\xA4) and CJK U+5BB6 (\xE5\xAE\xB6)
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+
+		// Check that characters are correctly converted
+		// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+		// cp437
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\x84xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\x84xyz"));
+
+		// iso8859
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\xE4xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE4xyz"));
+
+		// utf8
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\xC3\xA4xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc\xE5\xAE\xB6xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"));
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+
+		// wide L"" version
+
+		// Charset conversions (basic sanity checks)
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "a"), L"a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "a"), L"a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "a"), L"a");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "a"), L"a");
+
+	// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
+	// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4428) // universal-character-name encountered in source
+#endif
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u00E4xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u5BB6xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), L"abc"));
+
+		// Check that characters are correctly converted
+		// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+		// cp437
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "abc\x84xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\x84xyz"));
+
+		// iso8859
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "abc\xE4xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE4xyz"));
+
+		// utf8
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "abc\xC3\xA4xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "abc\xE5\xAE\xB6xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u5BB6xyz", mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"));
+
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif
+
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_CONVERT_HPP

Property changes on: src/mpt/string/tests/tests_string_convert.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_format_message.hpp
===================================================================
--- src/mpt/string/tests/tests_string_format_message.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_format_message.hpp	(working copy)
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP
+#define MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_message.hpp"
+#include "mpt/string/format_message_macros.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_format_message{
+	"mpt/string/format_message",
+	[](mpt::test::context & context) {
+		static_assert(mpt::parse_format_string_argument_count("") == 0);
+		static_assert(mpt::parse_format_string_argument_count("{{") == 0);
+		static_assert(mpt::parse_format_string_argument_count("}}") == 0);
+		static_assert(mpt::parse_format_string_argument_count("{}") == 1);
+		static_assert(mpt::parse_format_string_argument_count("{}{}") == 2);
+		static_assert(mpt::parse_format_string_argument_count("{0}{1}") == 2);
+
+		// basic
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}{}{}")(1, 2, 3), "123");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{2}{1}{0}")(1, 2, 3), "321");
+
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{2}{1}{0}{4}{3}{6}{5}{7}{10}{9}{8}")(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a"), "21043657a98");
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE(L"{}{}{}")(1, 2, 3), L"123");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+		// escaping behviour
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%")(), "%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%")(), "%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%%")(), "%%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}")("a"), "a");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%")("a"), "a%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%")("a"), "a%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%%")("a"), "a%%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%1")(), "%1");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%{}")("a"), "%a");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%b")(), "%b");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{{}}")(), "{}");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{{{}}}")("a"), "{a}");
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP

Property changes on: src/mpt/string/tests/tests_string_format_message.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_format_simple.hpp
===================================================================
--- src/mpt/string/tests/tests_string_format_simple.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_format_simple.hpp	(working copy)
@@ -0,0 +1,154 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP
+#define MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_format_simple{
+	"mpt/string/format_simple",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(1.5f), "1.5");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(true), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(false), "0");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(0), "0");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(-23), "-23");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(42), "42");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<3>((int32)-1), "-001");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex((int32)-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(-0xabcde), "-abcde");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(std::numeric_limits<int32>::min()), "-80000000");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(std::numeric_limits<int32>::min() + 1), "-7fffffff");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(0x123e), "123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<6>(0x123e), "00123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<2>(0x123e), "123e");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(1), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(1), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(1), "01");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(1), "001");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(11), "011");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(-1), "-01");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(-1), "-001");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(0xa2345678), MPT_USTRING("A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(0xa2345678), MPT_USTRING("A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(0xa2345678), MPT_USTRING("0A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(0xa2345678), MPT_USTRING("00A2345678"));
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex(0x123e), L"123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex0<6>(0x123e), L"00123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex0<2>(0x123e), L"123e");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(-87.0f), "-87");
+		if (mpt::format<std::string>::val(-0.5e-6) != "-5e-007"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-5e-07"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-5e-7"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-7"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-07"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-007")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-005"
+			&& mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-05"
+			&& mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-5")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-005"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-05"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-5"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-005"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-05"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-5")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(58.65403492763) != "58.654034927630001"
+			&& mpt::format<std::string>::val(58.65403492763) != "58.65403492763")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(58.65403492763, 6), "58.654");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(23.42, 1), "23.4");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(234.2, 1), "234.2");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(2342.0, 1), "2342.0");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec(2, ';', 2345678), std::string("2;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec(2, ';', 12345678), std::string("12;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(3, ':', 0xa2345678), std::string("a2:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::dec(2, ';', 12345678), MPT_USTRING("12;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::hex(3, ':', 0xa2345678), MPT_USTRING("a2:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', 0xa2345678), MPT_USTRING("A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(3, ':', 0xa2345678), MPT_USTRING("A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(3, ':', 0xa2345678), MPT_USTRING("0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(3, ':', 0xa2345678), MPT_USTRING("0:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<11>(3, ':', 0xa2345678), MPT_USTRING("00:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<12>(3, ':', 0xa2345678), MPT_USTRING("000:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', -0x12345678), MPT_USTRING("-12:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(3, ':', -0x12345678), MPT_USTRING("-12:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(3, ':', -0x12345678), MPT_USTRING("-012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(3, ':', -0x12345678), MPT_USTRING("-0:012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<11>(3, ':', -0x12345678), MPT_USTRING("-00:012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<12>(3, ':', -0x12345678), MPT_USTRING("-000:012:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<5>(3, ':', 0x345678), MPT_USTRING("345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<6>(3, ':', 0x345678), MPT_USTRING("345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', 0x345678), MPT_USTRING("0:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<5>(3, ':', -0x345678), MPT_USTRING("-345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<6>(3, ':', -0x345678), MPT_USTRING("-345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', -0x345678), MPT_USTRING("-0:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::left(3, "a"), "a  ");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::right(3, "a"), "  a");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::center(3, "a"), " a ");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::center(4, "a"), " a  ");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(6.12345, 3), "6.12");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(6.12345, 3), "6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(6.12345, 4), "6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(6.12345, 4), "6.1235");
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::flt(6.12345, 3), L"6.12");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::fix(6.12345, 3), L"6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::flt(6.12345, 4), L"6.123");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP

Property changes on: src/mpt/string/tests/tests_string_format_simple.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_parse.hpp
===================================================================
--- src/mpt/string/tests/tests_string_parse.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_parse.hpp	(working copy)
@@ -0,0 +1,70 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_PARSE_HPP
+#define MPT_STRING_TESTS_STRING_PARSE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/parse.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_parse{
+	"mpt/string/parse",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("586"), 586u);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("2147483647"), (uint32)std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("4294967295"), std::numeric_limits<uint32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("-9223372036854775808"), std::numeric_limits<int64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("-159"), -159);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("9223372036854775807"), std::numeric_limits<int64>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("85059"), 85059u);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("9223372036854775807"), (uint64)std::numeric_limits<int64>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("18446744073709551615"), std::numeric_limits<uint64>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<float>("-87.0"), -87.0f);
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>("-0.5e-6"), -0.5e-6);
+#endif
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>("58.65403492763"), 58.65403492763);
+#else
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStrTo<double>("58.65403492763"), 58.65403492763, 0.0001);
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<float>(mpt::format<std::string>::val(-87.0)), -87.0f);
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>(mpt::format<std::string>::val(-0.5e-6)), -0.5e-6);
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned char>("fe"), 254);
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned char>(L"fe"), 254);
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned int>(MPT_USTRING("ffff")), 65535u);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_PARSE_HPP

Property changes on: src/mpt/string/tests/tests_string_parse.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_utility.hpp
===================================================================
--- src/mpt/string/tests/tests_string_utility.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_utility.hpp	(working copy)
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_UTILITY_HPP
+#define MPT_STRING_TESTS_STRING_UTILITY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/utility.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_utility{
+	"mpt/string/utility",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_left(std::string(" ")), "");
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_right(std::string(" ")), "");
+		MPT_TEST_EXPECT_EQUAL(mpt::trim(std::string(" ")), "");
+
+		// weird things with std::string containing \0 in the middle and trimming \0
+		MPT_TEST_EXPECT_EQUAL(std::string("\0\ta\0b ", 6).length(), (std::size_t)6);
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_right(std::string("\0\ta\0b ", 6)), std::string("\0\ta\0b", 5));
+		MPT_TEST_EXPECT_EQUAL(mpt::trim(std::string("\0\ta\0b\0", 6), std::string("\0", 1)), std::string("\ta\0b", 4));
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_UTILITY_HPP

Property changes on: src/mpt/string/tests/tests_string_utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_buffer.hpp
===================================================================
--- src/mpt/string/tests/tests_string_buffer.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_buffer.hpp	(working copy)
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_BUFFER_HPP
+#define MPT_STRING_TESTS_STRING_BUFFER_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/buffer.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_buffer{
+	"mpt/string/buffer",
+	[](mpt::test::context & context) {
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteAutoBuf(buf) = std::string("foobar");
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			char foobar[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'};
+			mpt::WriteTypedBuf<std::string>(buf) = (char *)foobar;
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteTypedBuf<std::string>(buf) = (const char *)"foobar";
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			char buf[4] = {'x', 'x', 'x', 'x'};
+			mpt::WriteTypedBuf<std::string>(buf) = "foobar";
+			MPT_TEST_EXPECT_EQUAL(buf[0], 'f');
+			MPT_TEST_EXPECT_EQUAL(buf[1], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[2], 'o');
+			MPT_TEST_EXPECT_EQUAL(buf[3], '\0');
+		}
+		{
+			const char buf[4] = {'f', 'o', 'o', 'b'};
+			std::string foo = mpt::ReadAutoBuf(buf);
+			MPT_TEST_EXPECT_EQUAL(foo, std::string("foob"));
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_BUFFER_HPP

Property changes on: src/mpt/string/tests/tests_string_buffer.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_convert.hpp
===================================================================
--- src/mpt/string/tests/tests_string_convert.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_convert.hpp	(working copy)
@@ -0,0 +1,222 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_CONVERT_HPP
+#define MPT_STRING_TESTS_STRING_CONVERT_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/convert_macros.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_convert{
+	"mpt/string/convert",
+	[](mpt::test::context & context) {
+		// MPT_UTF8_STRING version
+
+		// Charset conversions (basic sanity checks)
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "a"), MPT_USTRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "a"), MPT_USTRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "a"), MPT_USTRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_USTRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "a"), MPT_USTRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "a"), MPT_UTF8_STRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "a"), MPT_UTF8_STRING("a"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "a"), MPT_UTF8_STRING("a"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("a")), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "a"), MPT_UTF8_STRING("a"));
+
+#if MPT_OS_EMSCRIPTEN
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("\xe2\x8c\x82")), "\xe2\x8c\x82");
+#endif // MPT_OS_EMSCRIPTEN
+
+		// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
+		// We test german umlaut-a (U+00E4) (\xC3\xA4) and CJK U+5BB6 (\xE5\xAE\xB6)
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("xyz")));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<mpt::ustring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), MPT_USTRING("abc")));
+
+		// Check that characters are correctly converted
+		// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+		// cp437
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::cp437, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\x84xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::cp437, "abc\x84xyz"));
+
+		// iso8859
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\xE4xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::iso8859_1, "abc\xE4xyz"));
+
+		// utf8
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xC3\xA4xyz")), "abc\xC3\xA4xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xC3\xA4xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz")), "abc\xE5\xAE\xB6xyz");
+		MPT_TEST_EXPECT_EQUAL(MPT_UTF8_STRING("abc\xE5\xAE\xB6xyz"), mpt::convert<mpt::ustring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"));
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+
+		// wide L"" version
+
+		// Charset conversions (basic sanity checks)
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::ascii, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "a"), L"a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "a"), L"a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "a"), L"a");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::logical_encoding::locale, L"a"), "a");
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "a"), L"a");
+
+	// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
+	// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+#if MPT_COMPILER_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4428) // universal-character-name encountered in source
+#endif
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u00E4xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u00E4xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::ascii, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u5BB6xyz"), "abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u5BB6xyz"), "xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::string>(mpt::logical_encoding::locale, L"abc\u5BB6xyz"), "abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xC3\xA4xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xC3\xA4xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::ascii, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\xE5\xAE\xB6xyz"), L"abc"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"), L"abc"));
+
+		MPT_TEST_EXPECT_EXPR(mpt::ends_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), L"xyz"));
+		MPT_TEST_EXPECT_EXPR(mpt::starts_with(mpt::convert<std::wstring>(mpt::logical_encoding::locale, "abc\xE5\xAE\xB6xyz"), L"abc"));
+
+		// Check that characters are correctly converted
+		// We test german umlaut-a (U+00E4) and CJK U+5BB6
+
+		// cp437
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::cp437, L"abc\u00E4xyz"), "abc\x84xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::cp437, "abc\x84xyz"));
+
+		// iso8859
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::iso8859_1, L"abc\u00E4xyz"), "abc\xE4xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::iso8859_1, "abc\xE4xyz"));
+
+		// utf8
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u00E4xyz"), "abc\xC3\xA4xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u00E4xyz", mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xC3\xA4xyz"));
+		MPT_TEST_EXPECT_EQUAL(mpt::convert<std::string>(mpt::common_encoding::utf8, L"abc\u5BB6xyz"), "abc\xE5\xAE\xB6xyz");
+		MPT_TEST_EXPECT_EQUAL(L"abc\u5BB6xyz", mpt::convert<std::wstring>(mpt::common_encoding::utf8, "abc\xE5\xAE\xB6xyz"));
+
+#if MPT_COMPILER_MSVC
+#pragma warning(pop)
+#endif
+
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_CONVERT_HPP

Property changes on: src/mpt/string/tests/tests_string_convert.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_format_message.hpp
===================================================================
--- src/mpt/string/tests/tests_string_format_message.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_format_message.hpp	(working copy)
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP
+#define MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_message.hpp"
+#include "mpt/string/format_message_macros.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_format_message{
+	"mpt/string/format_message",
+	[](mpt::test::context & context) {
+		static_assert(mpt::parse_format_string_argument_count("") == 0);
+		static_assert(mpt::parse_format_string_argument_count("{{") == 0);
+		static_assert(mpt::parse_format_string_argument_count("}}") == 0);
+		static_assert(mpt::parse_format_string_argument_count("{}") == 1);
+		static_assert(mpt::parse_format_string_argument_count("{}{}") == 2);
+		static_assert(mpt::parse_format_string_argument_count("{0}{1}") == 2);
+
+		// basic
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}{}{}")(1, 2, 3), "123");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{2}{1}{0}")(1, 2, 3), "321");
+
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{2}{1}{0}{4}{3}{6}{5}{7}{10}{9}{8}")(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a"), "21043657a98");
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE(L"{}{}{}")(1, 2, 3), L"123");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+		// escaping behviour
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%")(), "%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%")(), "%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%%")(), "%%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}")("a"), "a");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%")("a"), "a%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%")("a"), "a%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{}%%")("a"), "a%%");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%1")(), "%1");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%{}")("a"), "%a");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("%b")(), "%b");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{{}}")(), "{}");
+		MPT_TEST_EXPECT_EQUAL(MPT_FORMAT_MESSAGE("{{{}}}")("a"), "{a}");
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_FORMAT_MESSAGE_HPP

Property changes on: src/mpt/string/tests/tests_string_format_message.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_format_simple.hpp
===================================================================
--- src/mpt/string/tests/tests_string_format_simple.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_format_simple.hpp	(working copy)
@@ -0,0 +1,154 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP
+#define MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_format_simple{
+	"mpt/string/format_simple",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(1.5f), "1.5");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(true), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(false), "0");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(0), "0");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(-23), "-23");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(42), "42");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<3>((int32)-1), "-001");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex((int32)-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(-0xabcde), "-abcde");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(std::numeric_limits<int32>::min()), "-80000000");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(std::numeric_limits<int32>::min() + 1), "-7fffffff");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(0x123e), "123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<6>(0x123e), "00123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex0<2>(0x123e), "123e");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(1), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(1), "1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(1), "01");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(1), "001");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(11), "11");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(11), "011");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<0>(-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<1>(-1), "-1");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<2>(-1), "-01");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec0<3>(-1), "-001");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(0xa2345678), MPT_USTRING("A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(0xa2345678), MPT_USTRING("A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(0xa2345678), MPT_USTRING("0A2345678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(0xa2345678), MPT_USTRING("00A2345678"));
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex(0x123e), L"123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex0<6>(0x123e), L"00123e");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::hex0<2>(0x123e), L"123e");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::val(-87.0f), "-87");
+		if (mpt::format<std::string>::val(-0.5e-6) != "-5e-007"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-5e-07"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-5e-7"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-7"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-07"
+			&& mpt::format<std::string>::val(-0.5e-6) != "-4.9999999999999998e-007")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-005"
+			&& mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-05"
+			&& mpt::format<std::string>::val(-1.0 / 65536.0) != "-1.52587890625e-5")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-005"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-05"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.52587891e-5"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-005"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-05"
+			&& mpt::format<std::string>::val(-1.0f / 65536.0f) != "-1.5258789e-5")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		if (mpt::format<std::string>::val(58.65403492763) != "58.654034927630001"
+			&& mpt::format<std::string>::val(58.65403492763) != "58.65403492763")
+		{
+			MPT_TEST_EXPECT_EQUAL(true, false);
+		}
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(58.65403492763, 6), "58.654");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(23.42, 1), "23.4");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(234.2, 1), "234.2");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(2342.0, 1), "2342.0");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec(2, ';', 2345678), std::string("2;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::dec(2, ';', 12345678), std::string("12;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::hex(3, ':', 0xa2345678), std::string("a2:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::dec(2, ';', 12345678), MPT_USTRING("12;34;56;78"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::hex(3, ':', 0xa2345678), MPT_USTRING("a2:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', 0xa2345678), MPT_USTRING("A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(3, ':', 0xa2345678), MPT_USTRING("A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(3, ':', 0xa2345678), MPT_USTRING("0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(3, ':', 0xa2345678), MPT_USTRING("0:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<11>(3, ':', 0xa2345678), MPT_USTRING("00:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<12>(3, ':', 0xa2345678), MPT_USTRING("000:0A2:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', -0x12345678), MPT_USTRING("-12:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<8>(3, ':', -0x12345678), MPT_USTRING("-12:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<9>(3, ':', -0x12345678), MPT_USTRING("-012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<10>(3, ':', -0x12345678), MPT_USTRING("-0:012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<11>(3, ':', -0x12345678), MPT_USTRING("-00:012:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<12>(3, ':', -0x12345678), MPT_USTRING("-000:012:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<5>(3, ':', 0x345678), MPT_USTRING("345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<6>(3, ':', 0x345678), MPT_USTRING("345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', 0x345678), MPT_USTRING("0:345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<5>(3, ':', -0x345678), MPT_USTRING("-345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<6>(3, ':', -0x345678), MPT_USTRING("-345:678"));
+		MPT_TEST_EXPECT_EQUAL(mpt::format<mpt::ustring>::HEX0<7>(3, ':', -0x345678), MPT_USTRING("-0:345:678"));
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::left(3, "a"), "a  ");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::right(3, "a"), "  a");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::center(3, "a"), " a ");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::center(4, "a"), " a  ");
+
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(6.12345, 3), "6.12");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(6.12345, 3), "6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::flt(6.12345, 4), "6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::string>::fix(6.12345, 4), "6.1235");
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::flt(6.12345, 3), L"6.12");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::fix(6.12345, 3), L"6.123");
+		MPT_TEST_EXPECT_EQUAL(mpt::format<std::wstring>::flt(6.12345, 4), L"6.123");
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_FORMAT_SIMPLE_HPP

Property changes on: src/mpt/string/tests/tests_string_format_simple.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_parse.hpp
===================================================================
--- src/mpt/string/tests/tests_string_parse.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_parse.hpp	(working copy)
@@ -0,0 +1,70 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_PARSE_HPP
+#define MPT_STRING_TESTS_STRING_PARSE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/parse.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <limits>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_parse{
+	"mpt/string/parse",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("586"), 586u);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("2147483647"), (uint32)std::numeric_limits<int32>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint32>("4294967295"), std::numeric_limits<uint32>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("-9223372036854775808"), std::numeric_limits<int64>::min());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("-159"), -159);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<int64>("9223372036854775807"), std::numeric_limits<int64>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("85059"), 85059u);
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("9223372036854775807"), (uint64)std::numeric_limits<int64>::max());
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<uint64>("18446744073709551615"), std::numeric_limits<uint64>::max());
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<float>("-87.0"), -87.0f);
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>("-0.5e-6"), -0.5e-6);
+#endif
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>("58.65403492763"), 58.65403492763);
+#else
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStrTo<double>("58.65403492763"), 58.65403492763, 0.0001);
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<float>(mpt::format<std::string>::val(-87.0)), -87.0f);
+#if !MPT_OS_DJGPP
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertStringTo<double>(mpt::format<std::string>::val(-0.5e-6)), -0.5e-6);
+#endif
+
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned char>("fe"), 254);
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned char>(L"fe"), 254);
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+		MPT_TEST_EXPECT_EQUAL(mpt::ConvertHexStringTo<unsigned int>(MPT_USTRING("ffff")), 65535u);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_PARSE_HPP

Property changes on: src/mpt/string/tests/tests_string_parse.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/tests/tests_string_utility.hpp
===================================================================
--- src/mpt/string/tests/tests_string_utility.hpp	(nonexistent)
+++ src/mpt/string/tests/tests_string_utility.hpp	(working copy)
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TESTS_STRING_UTILITY_HPP
+#define MPT_STRING_TESTS_STRING_UTILITY_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/utility.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
+#include <string>
+
+#include <cstddef>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_string_utility{
+	"mpt/string/utility",
+	[](mpt::test::context & context) {
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_left(std::string(" ")), "");
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_right(std::string(" ")), "");
+		MPT_TEST_EXPECT_EQUAL(mpt::trim(std::string(" ")), "");
+
+		// weird things with std::string containing \0 in the middle and trimming \0
+		MPT_TEST_EXPECT_EQUAL(std::string("\0\ta\0b ", 6).length(), (std::size_t)6);
+		MPT_TEST_EXPECT_EQUAL(mpt::trim_right(std::string("\0\ta\0b ", 6)), std::string("\0\ta\0b", 5));
+		MPT_TEST_EXPECT_EQUAL(mpt::trim(std::string("\0\ta\0b\0", 6), std::string("\0", 1)), std::string("\ta\0b", 4));
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TESTS_STRING_UTILITY_HPP

Property changes on: src/mpt/string/tests/tests_string_utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/types.hpp
===================================================================
--- src/mpt/string/types.hpp	(nonexistent)
+++ src/mpt/string/types.hpp	(working copy)
@@ -0,0 +1,406 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_TYPES_HPP
+#define MPT_STRING_TYPES_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <string>
+#include <type_traits>
+
+#include <cstddef>
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+enum class common_encoding
+{
+	utf8,
+	ascii, // strictly 7-bit ASCII
+	iso8859_1,
+	iso8859_15,
+	cp850,
+	cp437,
+	windows1252,
+};
+
+
+enum class logical_encoding
+{
+	locale,        // CP_ACP on windows, system configured C locale otherwise
+	active_locale, // active C/C++ global locale
+};
+
+// source code / preprocessor (i.e. # token)
+inline constexpr auto source_encoding = common_encoding::ascii;
+
+// debug log files
+inline constexpr auto logfile_encoding = common_encoding::utf8;
+
+// std::clog / std::cout / std::cerr
+inline constexpr auto stdio_encoding = logical_encoding::locale;
+
+// getenv
+inline constexpr auto environment_encoding = logical_encoding::locale;
+
+// std::exception::what()
+inline constexpr auto exception_encoding = logical_encoding::active_locale;
+
+
+
+
+
+template <typename T>
+struct is_character : public std::false_type { };
+
+template <>
+struct is_character<char> : public std::true_type { };
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct is_character<wchar_t> : public std::true_type { };
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct is_character<char8_t> : public std::true_type { };
+#endif // C++20
+template <>
+struct is_character<char16_t> : public std::true_type { };
+template <>
+struct is_character<char32_t> : public std::true_type { };
+
+
+
+
+
+template <typename T>
+MPT_CONSTEXPRINLINE unsigned char char_value(T x) noexcept = delete;
+
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<char>(char x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<unsigned char>(unsigned char x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+MPT_CONSTEXPRINLINE unsigned char char_value<char8_t>(char8_t x) noexcept {
+	return static_cast<unsigned char>(x);
+}
+#endif // C++20
+
+
+
+
+
+template <typename T>
+struct unsafe_char_converter { };
+
+template <>
+struct unsafe_char_converter<char> {
+	static constexpr char32_t decode(char c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char encode(char32_t c) noexcept {
+		return static_cast<char>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct unsafe_char_converter<wchar_t> {
+	static constexpr char32_t decode(wchar_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr wchar_t encode(char32_t c) noexcept {
+		return static_cast<wchar_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct unsafe_char_converter<char8_t> {
+	static constexpr char32_t decode(char8_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char8_t encode(char32_t c) noexcept {
+		return static_cast<char8_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+#endif // C++20
+
+template <>
+struct unsafe_char_converter<char16_t> {
+	static constexpr char32_t decode(char16_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char16_t encode(char32_t c) noexcept {
+		return static_cast<char16_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+template <>
+struct unsafe_char_converter<char32_t> {
+	static constexpr char32_t decode(char32_t c) noexcept {
+		return static_cast<char32_t>(static_cast<uint32>(static_cast<unsigned char>(c)));
+	}
+	static constexpr char32_t encode(char32_t c) noexcept {
+		return static_cast<char32_t>(static_cast<unsigned char>(static_cast<uint32>(c)));
+	}
+};
+
+template <typename Tdstchar, typename Tsrcchar>
+constexpr Tdstchar unsafe_char_convert(Tsrcchar src) noexcept {
+	return mpt::unsafe_char_converter<Tdstchar>::encode(mpt::unsafe_char_converter<Tsrcchar>::decode(src));
+}
+
+
+
+
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+using widestring = std::wstring;
+using widechar = wchar_t;
+#define MPT_WIDECHAR(x)    L##x
+#define MPT_WIDELITERAL(x) L##x
+#define MPT_WIDESTRING(x)  std::wstring(L##x)
+#else // MPT_COMPILER_QUIRK_NO_WCHAR
+using widestring = std::u32string;
+using widechar = char32_t;
+#define MPT_WIDECHAR(x)    U##x
+#define MPT_WIDELITERAL(x) U##x
+#define MPT_WIDESTRING(x)  std::u32string(U##x)
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+
+
+template <common_encoding common_encoding_tag>
+struct common_encoding_char_traits : std::char_traits<char> {
+	static constexpr auto encoding() noexcept {
+		return common_encoding_tag;
+	}
+};
+
+template <logical_encoding logical_encoding_tag>
+struct logical_encoding_char_traits : std::char_traits<char> {
+	static constexpr auto encoding() noexcept {
+		return logical_encoding_tag;
+	}
+};
+
+
+
+using lstring = std::basic_string<char, mpt::logical_encoding_char_traits<logical_encoding::locale>>;
+
+using source_string = std::basic_string<char, mpt::common_encoding_char_traits<source_encoding>>;
+using exception_string = std::basic_string<char, mpt::logical_encoding_char_traits<exception_encoding>>;
+
+#if MPT_OS_WINDOWS
+
+template <typename Tchar>
+struct windows_char_traits { };
+template <>
+struct windows_char_traits<CHAR> { using string_type = mpt::lstring; };
+template <>
+struct windows_char_traits<WCHAR> { using string_type = std::wstring; };
+
+using tstring = windows_char_traits<TCHAR>::string_type;
+
+using winstring = mpt::tstring;
+
+#endif // MPT_OS_WINDOWS
+
+
+
+#if MPT_CXX_AT_LEAST(20)
+
+using u8string = std::u8string;
+using u8char = char8_t;
+#define MPT_U8CHAR(x)    u8##x
+#define MPT_U8LITERAL(x) u8##x
+#define MPT_U8STRING(x)  std::u8string(u8##x)
+
+#else // !C++20
+
+using u8string = std::basic_string<char, mpt::common_encoding_char_traits<common_encoding::utf8>>;
+using u8char = char;
+#define MPT_U8CHAR(x)    x
+#define MPT_U8LITERAL(x) x
+#define MPT_U8STRING(x)  mpt::u8string(x)
+
+// mpt::u8string is a moderately type-safe string that is meant to contain
+// UTF-8 encoded char bytes.
+//
+// mpt::u8string is not implicitely convertible to/from std::string, but
+// it is convertible to/from C strings the same way as std::string is.
+//
+// The implementation of mpt::u8string is a compromise of compatibilty
+// with implementation-defined STL details, efficiency, source code size,
+// executable bloat, type-safety  and simplicity.
+//
+// mpt::u8string is not meant to be used directly though.
+// mpt::u8string is meant as an alternative implementaion to std::wstring
+// for implementing the unicode string type mpt::ustring.
+
+#endif // C++20
+
+
+
+#if !defined(MPT_USTRING_MODE_UTF8_FORCE) && (MPT_COMPILER_MSVC || (MPT_DETECTED_MFC && defined(UNICODE)))
+// Use wide strings for MSVC because this is the native encoding on
+// microsoft platforms.
+#define MPT_USTRING_MODE_WIDE 1
+#define MPT_USTRING_MODE_UTF8 0
+#else
+#define MPT_USTRING_MODE_WIDE 0
+#define MPT_USTRING_MODE_UTF8 1
+#endif
+
+// mpt::ustring
+//
+// mpt::ustring is a string type that can hold unicode strings.
+// It is implemented as a std::basic_string either based on wchar_t (i.e. the
+//  same as std::wstring) or a custom-defined char_traits class that is derived
+//  from std::char_traits<char>.
+// The selection of the underlying implementation is done at compile-time.
+// MPT_UCHAR, MPT_ULITERAL and MPT_USTRING are macros that ease construction
+//  of ustring char literals, ustring char array literals and ustring objects
+//  from ustring char literals that work consistently in both modes.
+//  Note that these are not supported for non-ASCII characters appearing in
+//  the macro argument.
+// Also note that, as both UTF8 and UTF16 (it is less of an issue for UTF32)
+//  are variable-length encodings and mpt::ustring is implemented as a
+//  std::basic_string, all member functions that require individual character
+//  access will not work consistently or even at all in a meaningful way.
+//  This in particular affects operator[], at(), find() and substr().
+//  The code makes no effort in preventing these or generating warnings when
+//  these are used on mpt::ustring objects. However, compiling in the
+//  respectively other mpt::ustring mode will catch most of these anyway.
+
+#if MPT_USTRING_MODE_WIDE
+#if MPT_USTRING_MODE_UTF8
+#error "MPT_USTRING_MODE_WIDE and MPT_USTRING_MODE_UTF8 are mutually exclusive."
+#endif
+
+using ustring = std::wstring;
+using uchar = wchar_t;
+#define MPT_UCHAR(x)    L##x
+#define MPT_ULITERAL(x) L##x
+#define MPT_USTRING(x)  std::wstring(L##x)
+
+#endif // MPT_USTRING_MODE_WIDE
+
+#if MPT_USTRING_MODE_UTF8
+#if MPT_USTRING_MODE_WIDE
+#error "MPT_USTRING_MODE_WIDE and MPT_USTRING_MODE_UTF8 are mutually exclusive."
+#endif
+
+using ustring = mpt::u8string;
+using uchar = mpt::u8char;
+#define MPT_UCHAR(x)    MPT_U8CHAR(x)
+#define MPT_ULITERAL(x) MPT_U8LITERAL(x)
+#define MPT_USTRING(x)  MPT_U8STRING(x)
+
+#endif // MPT_USTRING_MODE_UTF8
+
+
+
+template <typename T>
+struct make_string_type { };
+
+template <typename T, typename Ttraits>
+struct make_string_type<std::basic_string<T, Ttraits>> {
+	using type = std::basic_string<T, Ttraits>;
+};
+
+template <typename T>
+struct make_string_type<const T *> {
+	using type = std::basic_string<T>;
+};
+
+template <typename T>
+struct make_string_type<T *> {
+	using type = std::basic_string<T>;
+};
+
+template <typename T, std::size_t N>
+struct make_string_type<T[N]> {
+	using type = typename make_string_type<T *>::type;
+};
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct make_string_type<CStringW> {
+	using type = CStringW;
+};
+
+template <>
+struct make_string_type<CStringA> {
+	using type = CStringA;
+};
+
+#endif // MPT_DETECTED_MFC
+
+
+
+template <typename T>
+struct is_string_type : public std::false_type { };
+template <>
+struct is_string_type<std::string> : public std::true_type { };
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct is_string_type<std::wstring> : public std::true_type { };
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct is_string_type<std::u8string> : public std::true_type { };
+#endif // C++20
+template <>
+struct is_string_type<std::u16string> : public std::true_type { };
+template <>
+struct is_string_type<std::u32string> : public std::true_type { };
+#if MPT_DETECTED_MFC
+template <>
+struct is_string_type<CStringW> : public std::true_type { };
+template <>
+struct is_string_type<CStringA> : public std::true_type { };
+#endif // MPT_DETECTED_MFC
+template <typename T, typename Ttraits>
+struct is_string_type<std::basic_string<T, Ttraits>> : public std::true_type { };
+
+
+
+template <typename T>
+inline typename mpt::make_string_type<T>::type as_string(const T & str) {
+	if constexpr (std::is_pointer<typename std::remove_cv<T>::type>::value) {
+		return str ? typename mpt::make_string_type<T>::type{str} : typename mpt::make_string_type<T>::type{};
+	} else {
+		return str;
+	}
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_TYPES_HPP

Property changes on: src/mpt/string/types.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/string/utility.hpp
===================================================================
--- src/mpt/string/utility.hpp	(nonexistent)
+++ src/mpt/string/utility.hpp	(working copy)
@@ -0,0 +1,334 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_STRING_UTILITY_HPP
+#define MPT_STRING_UTILITY_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/detect/mfc.hpp"
+
+#include <string>
+#include <vector>
+
+#include <cstddef>
+
+#if MPT_DETECTED_MFC
+// cppcheck-suppress missingInclude
+#include <afx.h>
+#endif // MPT_DETECTED_MFC
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+// string_traits abstract the API of underlying string classes, in particular they allow adopting to CString without having to specialize for CString explicitly
+
+template <typename Tstring>
+struct string_traits {
+
+	using string_type = Tstring;
+	using size_type = typename string_type::size_type;
+	using char_type = typename string_type::value_type;
+
+	static inline std::size_t length(const string_type & str) {
+		return str.length();
+	}
+
+	static inline void reserve(string_type & str, std::size_t size) {
+		str.reserve(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		return str.append(a);
+	}
+	static inline string_type & append(string_type & str, string_type && a) {
+		return str.append(std::move(a));
+	}
+	static inline string_type & append(string_type & str, std::size_t count, char_type c) {
+		return str.append(count, c);
+	}
+
+	static inline string_type pad(string_type str, std::size_t left, std::size_t right) {
+		str.insert(str.begin(), left, char_type(' '));
+		str.insert(str.end(), right, char_type(' '));
+		return str;
+	}
+};
+
+#if MPT_DETECTED_MFC
+
+template <>
+struct string_traits<CStringA> {
+
+	using string_type = CStringA;
+	using size_type = int;
+	using char_type = typename CStringA::XCHAR;
+
+	static inline size_type length(const string_type & str) {
+		return str.GetLength();
+	}
+
+	static inline void reserve(string_type & str, size_type size) {
+		str.Preallocate(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		str += a;
+		return str;
+	}
+	static inline string_type & append(string_type & str, size_type count, char_type c) {
+		while (count--) {
+			str.AppendChar(c);
+		}
+		return str;
+	}
+
+	static inline string_type pad(const string_type & str, size_type left, size_type right) {
+		string_type tmp;
+		while (left--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		tmp += str;
+		while (right--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		return tmp;
+	}
+};
+
+template <>
+struct string_traits<CStringW> {
+
+	using string_type = CStringW;
+	using size_type = int;
+	using char_type = typename CStringW::XCHAR;
+
+	static inline size_type length(const string_type & str) {
+		return str.GetLength();
+	}
+
+	static inline void reserve(string_type & str, size_type size) {
+		str.Preallocate(size);
+	}
+
+	static inline string_type & append(string_type & str, const string_type & a) {
+		str += a;
+		return str;
+	}
+	static inline string_type & append(string_type & str, size_type count, char_type c) {
+		while (count--) {
+			str.AppendChar(c);
+		}
+		return str;
+	}
+
+	static inline string_type pad(const string_type & str, size_type left, size_type right) {
+		string_type tmp;
+		while (left--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		tmp += str;
+		while (right--) {
+			tmp.AppendChar(char_type(' '));
+		}
+		return tmp;
+	}
+};
+
+#endif // MPT_DETECTED_MFC
+
+
+template <typename Tchar>
+struct char_constants {
+	static inline constexpr Tchar space = ' ';
+	static inline constexpr Tchar a = 'a';
+	static inline constexpr Tchar z = 'z';
+	static inline constexpr Tchar A = 'A';
+	static inline constexpr Tchar Z = 'Z';
+	static inline constexpr Tchar lf = '\n';
+	static inline constexpr Tchar cr = '\r';
+	static inline constexpr Tchar tab = '\t';
+	static inline constexpr Tchar comma = ',';
+};
+
+template <>
+struct char_constants<char> {
+	static inline constexpr char space = ' ';
+	static inline constexpr char a = 'a';
+	static inline constexpr char z = 'z';
+	static inline constexpr char A = 'A';
+	static inline constexpr char Z = 'Z';
+	static inline constexpr char lf = '\n';
+	static inline constexpr char cr = '\r';
+	static inline constexpr char tab = '\t';
+	static inline constexpr char comma = ',';
+};
+
+#if !defined(MPT_COMPILER_QUIRK_NO_WCHAR)
+template <>
+struct char_constants<wchar_t> {
+	static inline constexpr wchar_t space = L' ';
+	static inline constexpr wchar_t a = L'a';
+	static inline constexpr wchar_t z = L'z';
+	static inline constexpr wchar_t A = L'A';
+	static inline constexpr wchar_t Z = L'Z';
+	static inline constexpr wchar_t lf = L'\n';
+	static inline constexpr wchar_t cr = L'\r';
+	static inline constexpr wchar_t tab = L'\t';
+	static inline constexpr wchar_t comma = L',';
+};
+#endif // !MPT_COMPILER_QUIRK_NO_WCHAR
+
+#if MPT_CXX_AT_LEAST(20)
+template <>
+struct char_constants<char8_t> {
+	static inline constexpr char8_t space = u8' ';
+	static inline constexpr char8_t a = u8'a';
+	static inline constexpr char8_t z = u8'z';
+	static inline constexpr char8_t A = u8'A';
+	static inline constexpr char8_t Z = u8'Z';
+	static inline constexpr char8_t lf = u8'\n';
+	static inline constexpr char8_t cr = u8'\r';
+	static inline constexpr char8_t tab = u8'\t';
+	static inline constexpr char8_t comma = u8',';
+};
+#endif
+
+template <>
+struct char_constants<char16_t> {
+	static inline constexpr char16_t space = u' ';
+	static inline constexpr char16_t a = u'a';
+	static inline constexpr char16_t z = u'z';
+	static inline constexpr char16_t A = u'A';
+	static inline constexpr char16_t Z = u'Z';
+	static inline constexpr char16_t lf = u'\n';
+	static inline constexpr char16_t cr = u'\r';
+	static inline constexpr char16_t tab = u'\t';
+	static inline constexpr char16_t comma = u',';
+};
+
+template <>
+struct char_constants<char32_t> {
+	static inline constexpr char32_t space = U' ';
+	static inline constexpr char32_t a = U'a';
+	static inline constexpr char32_t z = U'z';
+	static inline constexpr char32_t A = U'A';
+	static inline constexpr char32_t Z = U'Z';
+	static inline constexpr char32_t lf = U'\n';
+	static inline constexpr char32_t cr = U'\r';
+	static inline constexpr char32_t tab = U'\t';
+	static inline constexpr char32_t comma = U',';
+};
+
+
+template <typename Tstring>
+inline Tstring default_whitespace() {
+	Tstring result;
+	result.reserve(4);
+	result.push_back(char_constants<typename Tstring::value_type>::space);
+	result.push_back(char_constants<typename Tstring::value_type>::lf);
+	result.push_back(char_constants<typename Tstring::value_type>::cr);
+	result.push_back(char_constants<typename Tstring::value_type>::tab);
+	return result;
+}
+
+
+// Remove whitespace at start of string
+template <typename Tstring>
+inline Tstring trim_left(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	typename Tstring::size_type pos = str.find_first_not_of(whitespace);
+	if (pos != Tstring::npos) {
+		str.erase(str.begin(), str.begin() + pos);
+	} else if (pos == Tstring::npos && str.length() > 0 && str.find_last_of(whitespace) == str.length() - 1) {
+		return Tstring();
+	}
+	return str;
+}
+
+// Remove whitespace at end of string
+template <typename Tstring>
+inline Tstring trim_right(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	typename Tstring::size_type pos = str.find_last_not_of(whitespace);
+	if (pos != Tstring::npos) {
+		str.erase(str.begin() + pos + 1, str.end());
+	} else if (pos == Tstring::npos && str.length() > 0 && str.find_first_of(whitespace) == 0) {
+		return Tstring();
+	}
+	return str;
+}
+
+// Remove whitespace at start and end of string
+template <typename Tstring>
+inline Tstring trim(Tstring str, const Tstring & whitespace = default_whitespace<Tstring>()) {
+	return trim_right(trim_left(str, whitespace), whitespace);
+}
+
+
+template <typename Tstring, typename Tmatch>
+inline bool starts_with(const Tstring & str, const Tmatch & match) {
+	return (str.find(typename mpt::make_string_type<Tmatch>::type{match}) == 0);
+}
+
+template <typename Tstring, typename Tmatch>
+inline bool ends_with(const Tstring & str, const Tmatch & match) {
+	return (str.rfind(typename mpt::make_string_type<Tmatch>::type{match}) == (str.length() - typename mpt::make_string_type<Tmatch>::type{match}.length()));
+}
+
+
+template <typename Tchar>
+inline constexpr Tchar to_lower_ascii(Tchar c) noexcept {
+	if (char_constants<Tchar>::A <= c && c <= char_constants<Tchar>::Z) {
+		c += char_constants<Tchar>::a - char_constants<Tchar>::A;
+	}
+	return c;
+}
+
+template <typename Tchar>
+inline constexpr Tchar to_upper_ascii(Tchar c) noexcept {
+	if (char_constants<Tchar>::a <= c && c <= char_constants<Tchar>::z) {
+		c -= char_constants<Tchar>::a - char_constants<Tchar>::A;
+	}
+	return c;
+}
+
+
+
+template <typename Tstring>
+inline std::vector<Tstring> split(const Tstring & str, const Tstring & sep = Tstring(1, char_constants<typename Tstring::value_type>::comma)) {
+	std::vector<Tstring> vals;
+	std::size_t pos = 0;
+	while (str.find(sep, pos) != std::string::npos) {
+		vals.push_back(str.substr(pos, str.find(sep, pos) - pos));
+		pos = str.find(sep, pos) + sep.length();
+	}
+	if (!vals.empty() || (str.substr(pos).length() > 0)) {
+		vals.push_back(str.substr(pos));
+	}
+	return vals;
+}
+
+
+
+template <typename Tstring>
+inline Tstring combine(const std::vector<Tstring> & vals, const Tstring & sep = Tstring(1, char_constants<typename Tstring::value_type>::comma)) {
+	Tstring str;
+	for (std::size_t i = 0; i < vals.size(); ++i) {
+		if (i > 0) {
+			str += sep;
+		}
+		str += vals[i];
+	}
+	return str;
+}
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_STRING_UTILITY_HPP

Property changes on: src/mpt/string/utility.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/system_error/system_error.hpp
===================================================================
--- src/mpt/system_error/system_error.hpp	(nonexistent)
+++ src/mpt/system_error/system_error.hpp	(working copy)
@@ -0,0 +1,170 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP
+#define MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/format_message.hpp"
+#include "mpt/string/format_message_macros.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+
+#if MPT_OS_WINDOWS
+#include <stdexcept>
+#if MPT_OS_WINDOWS_WINRT
+#include <vector>
+#endif // MPT_OS_WINDOWS_WINRT
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+
+namespace windows {
+
+
+
+inline mpt::ustring GetErrorMessage(DWORD errorCode, HANDLE hModule = NULL) {
+#if MPT_OS_WINDOWS_WINRT
+	std::vector<TCHAR> msgbuf(65536);
+	if (FormatMessage(
+			(hModule ? FORMAT_MESSAGE_FROM_HMODULE : 0) | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+			hModule,
+			errorCode,
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+			msgbuf.data(),
+			mpt::saturate_cast<DWORD>(msgbuf.size()),
+			NULL)
+		== 0)
+	{
+		DWORD e = GetLastError();
+		if ((e == ERROR_NOT_ENOUGH_MEMORY) || (e == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		return {};
+	}
+	return mpt::convert<mpt::ustring>(mpt::winstring{msgbuf.data()});
+#else
+	mpt::ustring message;
+	void * lpMsgBuf = nullptr;
+	if (FormatMessage(
+			FORMAT_MESSAGE_ALLOCATE_BUFFER | (hModule ? FORMAT_MESSAGE_FROM_HMODULE : 0) | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+			hModule,
+			errorCode,
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+			(LPTSTR)&lpMsgBuf,
+			0,
+			NULL)
+		== 0)
+	{
+		DWORD e = GetLastError();
+		if (lpMsgBuf) {
+			LocalFree(lpMsgBuf);
+		}
+		if ((e == ERROR_NOT_ENOUGH_MEMORY) || (e == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		return {};
+	}
+	if (!lpMsgBuf) {
+		return {};
+	}
+	try {
+		message = mpt::convert<mpt::ustring>(mpt::winstring{static_cast<LPTSTR>(lpMsgBuf)});
+	} catch (mpt::out_of_memory e) {
+		LocalFree(lpMsgBuf);
+		mpt::rethrow_out_of_memory(e);
+	}
+	LocalFree(lpMsgBuf);
+	return message;
+#endif
+}
+
+
+class error
+	: public std::runtime_error {
+public:
+	error(DWORD errorCode, HANDLE hModule = NULL)
+		: std::runtime_error(mpt::convert<std::string>(mpt::exception_encoding, MPT_UFORMAT_MESSAGE("Windows Error: 0x{}: {}")(mpt::format<mpt::ustring>::hex0<8>(errorCode), GetErrorMessage(errorCode, hModule)))) {
+		return;
+	}
+};
+
+
+inline HANDLE CheckFileHANDLE(HANDLE handle) {
+	if (handle == INVALID_HANDLE_VALUE) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+	return handle;
+}
+
+
+inline HANDLE CheckHANDLE(HANDLE handle) {
+	if (handle == NULL) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+	return handle;
+}
+
+
+inline void CheckBOOL(BOOL result) {
+	if (result == FALSE) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+}
+
+
+inline void ExpectError(DWORD expected) {
+	DWORD err = ::GetLastError();
+	if (err != expected) {
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+}
+
+
+
+} // namespace windows
+
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP

Property changes on: src/mpt/system_error/system_error.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/system_error/system_error.hpp
===================================================================
--- src/mpt/system_error/system_error.hpp	(nonexistent)
+++ src/mpt/system_error/system_error.hpp	(working copy)
@@ -0,0 +1,170 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP
+#define MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/format_message.hpp"
+#include "mpt/string/format_message_macros.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+
+#if MPT_OS_WINDOWS
+#include <stdexcept>
+#if MPT_OS_WINDOWS_WINRT
+#include <vector>
+#endif // MPT_OS_WINDOWS_WINRT
+#endif // MPT_OS_WINDOWS
+
+#if MPT_OS_WINDOWS
+#include <windows.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+
+namespace windows {
+
+
+
+inline mpt::ustring GetErrorMessage(DWORD errorCode, HANDLE hModule = NULL) {
+#if MPT_OS_WINDOWS_WINRT
+	std::vector<TCHAR> msgbuf(65536);
+	if (FormatMessage(
+			(hModule ? FORMAT_MESSAGE_FROM_HMODULE : 0) | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+			hModule,
+			errorCode,
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+			msgbuf.data(),
+			mpt::saturate_cast<DWORD>(msgbuf.size()),
+			NULL)
+		== 0)
+	{
+		DWORD e = GetLastError();
+		if ((e == ERROR_NOT_ENOUGH_MEMORY) || (e == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		return {};
+	}
+	return mpt::convert<mpt::ustring>(mpt::winstring{msgbuf.data()});
+#else
+	mpt::ustring message;
+	void * lpMsgBuf = nullptr;
+	if (FormatMessage(
+			FORMAT_MESSAGE_ALLOCATE_BUFFER | (hModule ? FORMAT_MESSAGE_FROM_HMODULE : 0) | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+			hModule,
+			errorCode,
+			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+			(LPTSTR)&lpMsgBuf,
+			0,
+			NULL)
+		== 0)
+	{
+		DWORD e = GetLastError();
+		if (lpMsgBuf) {
+			LocalFree(lpMsgBuf);
+		}
+		if ((e == ERROR_NOT_ENOUGH_MEMORY) || (e == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		return {};
+	}
+	if (!lpMsgBuf) {
+		return {};
+	}
+	try {
+		message = mpt::convert<mpt::ustring>(mpt::winstring{static_cast<LPTSTR>(lpMsgBuf)});
+	} catch (mpt::out_of_memory e) {
+		LocalFree(lpMsgBuf);
+		mpt::rethrow_out_of_memory(e);
+	}
+	LocalFree(lpMsgBuf);
+	return message;
+#endif
+}
+
+
+class error
+	: public std::runtime_error {
+public:
+	error(DWORD errorCode, HANDLE hModule = NULL)
+		: std::runtime_error(mpt::convert<std::string>(mpt::exception_encoding, MPT_UFORMAT_MESSAGE("Windows Error: 0x{}: {}")(mpt::format<mpt::ustring>::hex0<8>(errorCode), GetErrorMessage(errorCode, hModule)))) {
+		return;
+	}
+};
+
+
+inline HANDLE CheckFileHANDLE(HANDLE handle) {
+	if (handle == INVALID_HANDLE_VALUE) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+	return handle;
+}
+
+
+inline HANDLE CheckHANDLE(HANDLE handle) {
+	if (handle == NULL) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+	return handle;
+}
+
+
+inline void CheckBOOL(BOOL result) {
+	if (result == FALSE) {
+		DWORD err = ::GetLastError();
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+}
+
+
+inline void ExpectError(DWORD expected) {
+	DWORD err = ::GetLastError();
+	if (err != expected) {
+		if ((err == ERROR_NOT_ENOUGH_MEMORY) || (err == ERROR_OUTOFMEMORY)) {
+			mpt::throw_out_of_memory();
+		}
+		throw windows::error(err);
+	}
+}
+
+
+
+} // namespace windows
+
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_SYSTEM_ERROR_SYSTEM_ERROR_HPP

Property changes on: src/mpt/system_error/system_error.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/test/test.hpp
===================================================================
--- src/mpt/test/test.hpp	(nonexistent)
+++ src/mpt/test/test.hpp	(working copy)
@@ -0,0 +1,549 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_TEST_TEST_HPP
+#define MPT_TEST_TEST_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/source_location.hpp"
+
+#include <functional>
+#include <iostream>
+#include <map>
+#include <sstream>
+#include <stdexcept>
+#include <type_traits>
+#include <typeinfo>
+#include <utility>
+#include <variant>
+
+#include <cstddef>
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace test {
+
+
+
+template <typename S, typename T, typename = void>
+struct is_to_stream_writable : std::false_type { };
+
+template <typename S, typename T>
+struct is_to_stream_writable<S, T, std::void_t<decltype(std::declval<S &>() << std::declval<T>())>> : std::true_type { };
+
+template <typename T>
+inline auto format(const T & x) -> typename std::enable_if<mpt::test::is_to_stream_writable<std::ostringstream, T>::value, std::string>::type {
+	std::ostringstream s;
+	s << x;
+	return s.str();
+}
+
+template <typename T>
+inline auto format(const T & x) -> typename std::enable_if<!mpt::test::is_to_stream_writable<std::ostringstream, T>::value, std::string>::type {
+	return typeid(x).name();
+}
+
+inline std::string get_exception_text() {
+	std::string result;
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		result = e.what();
+	} catch (...) {
+		result = "unknown exception";
+	}
+	return result;
+}
+
+struct result_success {
+};
+struct result_failure {
+	std::string text{};
+};
+struct result_unexpected_exception {
+	std::string text{};
+};
+
+struct result {
+	std::variant<std::monostate, result_success, result_failure, result_unexpected_exception> info{std::monostate{}};
+};
+
+struct statistics_counters {
+	std::size_t total{0};
+	std::size_t run{0};
+	std::size_t successes{0};
+	std::size_t failures{0};
+	std::size_t unexpected_exceptions{0};
+	std::size_t completed{0};
+	constexpr statistics_counters & operator+=(const statistics_counters & other) noexcept {
+		total += other.total;
+		run += other.run;
+		successes += other.successes;
+		failures += other.failures;
+		unexpected_exceptions += other.unexpected_exceptions;
+		completed += other.completed;
+		return *this;
+	}
+};
+
+struct group_statistics {
+	statistics_counters tests{};
+	statistics_counters cases{};
+	statistics_counters local_cases{};
+};
+
+struct global_statistics {
+	statistics_counters groups{};
+	statistics_counters tests{};
+	statistics_counters cases{};
+	std::map<std::string, group_statistics> individual_group_statistics{};
+	explicit constexpr operator bool() noexcept {
+		return succeeded();
+	}
+	constexpr bool operator!() noexcept {
+		return failed();
+	}
+	constexpr bool succeeded() noexcept {
+		return groups.successes == groups.run;
+	}
+	constexpr bool failed() noexcept {
+		return groups.failures > 0 || groups.unexpected_exceptions > 0;
+	}
+};
+
+class reporter_interface {
+protected:
+	virtual ~reporter_interface() = default;
+
+public:
+	virtual void run_begin(const mpt::source_location & loc) = 0;
+	virtual void group_begin(const mpt::source_location & loc, const char * name) = 0;
+	virtual void test_begin(const mpt::source_location & loc, const char * name) = 0;
+	virtual void case_run(const mpt::source_location & loc) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_e) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_ex, const char * text_e) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_a, const char * text_cmp, const char * text_b) = 0;
+	virtual void case_result(const mpt::source_location & loc, const mpt::test::result & result) = 0;
+	virtual void test_end(const mpt::source_location & loc, const char * name, const statistics_counters & counters) = 0;
+	virtual void group_end(const mpt::source_location & loc, const char * name, const group_statistics & statistics) = 0;
+	virtual void run_end(const mpt::source_location & loc, const global_statistics & statistics) = 0;
+	virtual void immediate_breakpoint() = 0;
+};
+
+class silent_reporter
+	: public reporter_interface {
+public:
+	silent_reporter() = default;
+	~silent_reporter() override = default;
+
+public:
+	virtual void run_begin(const mpt::source_location &) override {
+	}
+	virtual void group_begin(const mpt::source_location &, const char *) override {
+	}
+	virtual void test_begin(const mpt::source_location &, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *, const char *, const char *) override {
+	}
+	virtual void case_result(const mpt::source_location &, const mpt::test::result &) override {
+	}
+	virtual void test_end(const mpt::source_location &, const char *, const statistics_counters &) override {
+	}
+	virtual void group_end(const mpt::source_location &, const char *, const group_statistics &) override {
+	}
+	virtual void run_end(const mpt::source_location &, const global_statistics &) override {
+	}
+	virtual void immediate_breakpoint() override {
+	}
+};
+
+class simple_reporter : public reporter_interface {
+private:
+	std::ostream & s;
+
+public:
+	simple_reporter(std::ostream & s_)
+		: s(s_) {
+		s.flush();
+	}
+	~simple_reporter() override {
+		s.flush();
+	}
+
+public:
+	void run_begin(const mpt::source_location & loc) override {
+		static_cast<void>(loc);
+		s << "Running test suite ..." << std::endl;
+	}
+	void group_begin(const mpt::source_location & loc, const char * name) override {
+		static_cast<void>(loc);
+		s << "Running group '" << name << "' ..." << std::endl;
+	}
+	void test_begin(const mpt::source_location & loc, const char * name) override {
+		static_cast<void>(loc);
+		s << " Running test '" << name << "' ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc) override {
+		static_cast<void>(loc);
+		s << "  Checking ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc, const char * text_e) override {
+		static_cast<void>(loc);
+		s << "  Checking '" << text_e << "' ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc, const char * text_ex, const char * text_e) override {
+		static_cast<void>(loc);
+		if (text_ex) {
+			s << "  Checking '" << text_e << " throws " << text_ex << "' ..." << std::endl;
+		} else {
+			s << "  Checking '" << text_e << " throws' ..." << std::endl;
+		}
+	}
+	void case_run(const mpt::source_location & loc, const char * text_a, const char * text_cmp, const char * text_b) override {
+		static_cast<void>(loc);
+		s << "  Checking '" << text_a << " " << text_cmp << " " << text_b << "' ..." << std::endl;
+	}
+	void case_result(const mpt::source_location & loc, const mpt::test::result & result) override {
+		static_cast<void>(loc);
+		s << "  Checking done: ";
+		if (std::holds_alternative<result_success>(result.info)) {
+			s << "Success.";
+		} else if (std::holds_alternative<result_failure>(result.info)) {
+			s << "FAILURE: " << std::get<result_failure>(result.info).text;
+		} else if (std::holds_alternative<result_unexpected_exception>(result.info)) {
+			s << "UNEXPECTED EXCEPTION: " << std::get<result_unexpected_exception>(result.info).text;
+		}
+		s << std::endl;
+	}
+	void test_end(const mpt::source_location & loc, const char * name, const statistics_counters & counters) override {
+		static_cast<void>(loc);
+		static_cast<void>(counters);
+		s << " Running test '" << name << "' done." << std::endl;
+	}
+	void group_end(const mpt::source_location & loc, const char * name, const group_statistics & statistics) override {
+		static_cast<void>(loc);
+		static_cast<void>(statistics);
+		s << "Running group '" << name << "' done." << std::endl;
+	}
+	void run_end(const mpt::source_location & loc, const global_statistics & statistics) override {
+		static_cast<void>(loc);
+		s << "Running test suite done." << std::endl;
+		s << "groups: " << statistics.groups.total << " | " << statistics.groups.successes << " passed";
+		if (statistics.groups.failures || statistics.groups.unexpected_exceptions) {
+			s << " | " << statistics.groups.failures << " FAILED";
+			if (statistics.groups.unexpected_exceptions) {
+				s << " | " << statistics.groups.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+		s << "tests: " << statistics.tests.total << " | " << statistics.tests.successes << " passed";
+		if (statistics.tests.failures || statistics.tests.unexpected_exceptions) {
+			s << " | " << statistics.tests.failures << " FAILED";
+			if (statistics.tests.unexpected_exceptions) {
+				s << " | " << statistics.tests.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+		s << "checks: " << statistics.cases.total << " | " << statistics.cases.successes << " passed";
+		if (statistics.cases.failures || statistics.cases.unexpected_exceptions) {
+			s << " | " << statistics.cases.failures << " FAILED";
+			if (statistics.cases.unexpected_exceptions) {
+				s << " | " << statistics.cases.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+	}
+	void immediate_breakpoint() override {
+		return;
+	}
+};
+
+struct group;
+
+struct context {
+	mpt::test::group & group;
+	mpt::test::reporter_interface & reporter;
+	mpt::test::group_statistics statistics{};
+};
+
+using void_context_function = void (*)(mpt::test::context &);
+
+struct group {
+	group * next{nullptr};
+	const char * name{""};
+	void_context_function func{nullptr};
+	inline group(const char * name_, void_context_function f)
+		: name(name_)
+		, func(f) {
+		next = group_list();
+		group_list() = this;
+	}
+	group_statistics run(mpt::test::reporter_interface & reporter, const mpt::source_location & loc = mpt::source_location::current()) {
+		mpt::test::context context{*this, reporter};
+		context.reporter.group_begin(loc, name);
+		if (func) {
+			func(context);
+		}
+		context.reporter.group_end(loc, name, context.statistics);
+		return context.statistics;
+	}
+
+public:
+	[[nodiscard]] static inline group *& group_list() noexcept {
+		static group * group_list = nullptr;
+		return group_list;
+	}
+};
+
+inline global_statistics run_all(mpt::test::reporter_interface & reporter, const mpt::source_location & loc = mpt::source_location::current()) {
+	global_statistics statistics{};
+	reporter.run_begin(loc);
+	for (group * g = group::group_list(); g; g = g->next) {
+		statistics.groups.total++;
+		statistics.groups.run++;
+		group_statistics s = g->run(reporter, loc);
+		if (s.tests.unexpected_exceptions) {
+			statistics.groups.unexpected_exceptions++;
+		} else if (s.tests.failures) {
+			statistics.groups.failures++;
+		} else {
+			statistics.groups.successes++;
+		}
+		statistics.tests += s.tests;
+		statistics.cases += s.cases;
+		statistics.groups.completed++;
+		statistics.individual_group_statistics[g->name] = s;
+	}
+	reporter.run_end(loc, statistics);
+	return statistics;
+}
+
+struct test {
+
+	mpt::test::context & context;
+	const char * name{""};
+	mpt::source_location source_location{mpt::source_location::current()};
+	void (*breakpoint)(void){nullptr};
+
+	test(const test &) = delete;
+	test & operator=(const test &) = delete;
+
+	inline test(mpt::test::context & context_, void (*breakpoint_)(void) = nullptr, const mpt::source_location & source_location_ = mpt::source_location::current())
+		: context(context_)
+		, source_location(source_location_)
+		, breakpoint(breakpoint_) {
+		report_test_begin();
+	}
+	inline test(mpt::test::context & context_, const char * name_, void (*breakpoint_)(void) = nullptr, const mpt::source_location & source_location_ = mpt::source_location::current())
+		: context(context_)
+		, name(name_)
+		, source_location(source_location_)
+		, breakpoint(breakpoint_) {
+		report_test_begin();
+	}
+
+	inline ~test() {
+		report_test_end();
+	}
+
+	void immediate_breakpoint() {
+		if (breakpoint) {
+			breakpoint();
+		} else {
+			context.reporter.immediate_breakpoint();
+		}
+	}
+
+	void report_test_begin() {
+		context.statistics.tests.total++;
+		context.statistics.tests.run++;
+		context.statistics.local_cases = statistics_counters{};
+		context.reporter.test_begin(source_location, name);
+	}
+
+	void report_run() {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location);
+	}
+	void report_run(const char * text_e) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_e);
+	}
+	void report_run(const char * text_ex, const char * text_e) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_ex, text_e);
+	}
+	void report_run(const char * text_a, const char * text_cmp, const char * text_b) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_a, text_cmp, text_b);
+	}
+
+	void report_result(mpt::test::result result) {
+		if (std::holds_alternative<result_success>(result.info)) {
+			context.statistics.local_cases.successes++;
+		} else if (std::holds_alternative<result_failure>(result.info)) {
+			context.statistics.local_cases.failures++;
+		} else if (std::holds_alternative<result_unexpected_exception>(result.info)) {
+			context.statistics.local_cases.unexpected_exceptions++;
+		}
+		context.statistics.local_cases.completed++;
+		context.reporter.case_result(source_location, result);
+	}
+
+	void report_test_end() {
+		context.statistics.cases += context.statistics.local_cases;
+		if (context.statistics.local_cases.unexpected_exceptions) {
+			context.statistics.tests.unexpected_exceptions++;
+		} else if (context.statistics.local_cases.failures) {
+			context.statistics.tests.failures++;
+		} else {
+			context.statistics.tests.successes++;
+		}
+		context.statistics.tests.completed++;
+		context.reporter.test_end(source_location, name, context.statistics.local_cases);
+	}
+
+	template <typename Texception, typename Tcallable, typename std::enable_if<std::is_invocable<Tcallable>::value, bool>::type = true>
+	inline test & expect_throws(Tcallable c, const char * text_ex = nullptr, const char * text_e = nullptr) {
+		report_run(text_ex ? text_ex : typeid(Texception).name(), text_e ? text_e : typeid(decltype(c())).name());
+		mpt::test::result result;
+		try {
+			c();
+			immediate_breakpoint();
+			result.info = mpt::test::result_failure{};
+		} catch (const Texception &) {
+			result.info = mpt::test::result_success{};
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Tcallable, typename std::enable_if<std::is_invocable<Tcallable>::value, bool>::type = true>
+	inline test & expect_throws_any(Tcallable c, const char * text_e = nullptr) {
+		report_run(nullptr, text_e ? text_e : typeid(decltype(c())).name());
+		mpt::test::result result;
+		try {
+			c();
+			immediate_breakpoint();
+			result.info = mpt::test::result_failure{};
+		} catch (...) {
+			result.info = mpt::test::result_success{};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Texpr, typename std::enable_if<std::is_invocable<Texpr>::value, bool>::type = true>
+	inline test & expect(Texpr e, const char * text_e = nullptr) {
+		report_run(text_e ? text_e : typeid(decltype(std::invoke(e))).name());
+		mpt::test::result result;
+		try {
+			const auto ve = std::invoke(e);
+			if (!ve) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{/*mpt::test::format(ve)*/};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Ta, typename Tcmp, typename Tb, typename std::enable_if<std::is_invocable<Ta>::value, bool>::type = true, typename std::enable_if<std::is_invocable<Tb>::value, bool>::type = true>
+	inline test & expect(Ta && a, Tcmp cmp, Tb && b, const char * text_a = nullptr, const char * text_cmp = nullptr, const char * text_b = nullptr) {
+		report_run(text_a ? text_a : typeid(decltype(std::invoke(a))).name(), text_cmp ? text_cmp : typeid(decltype(cmp)).name(), text_b ? text_b : typeid(decltype(std::invoke(b))).name());
+		mpt::test::result result;
+		try {
+			const auto va = std::invoke(a);
+			const auto vb = std::invoke(b);
+			if (!cmp(va, vb)) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{mpt::test::format(va) + " " + mpt::test::format(cmp) + " " + mpt::test::format(vb)};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Texpr, typename std::enable_if<!std::is_invocable<Texpr>::value, bool>::type = true>
+	inline test & expect(Texpr && e, const char * text_e = nullptr) {
+		report_run(text_e ? text_e : typeid(decltype(std::forward<Texpr>(e))).name());
+		mpt::test::result result;
+		try {
+			const auto ve = std::forward<Texpr>(e);
+			if (!ve) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{/*mpt::test::format(ve)*/};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Ta, typename Tcmp, typename Tb, typename std::enable_if<!std::is_invocable<Ta>::value, bool>::type = true, typename std::enable_if<!std::is_invocable<Tb>::value, bool>::type = true>
+	inline test & expect(Ta && a, Tcmp cmp, Tb && b, const char * text_a = nullptr, const char * text_cmp = nullptr, const char * text_b = nullptr) {
+		report_run(text_a ? text_a : typeid(decltype(std::forward<Ta>(a))).name(), text_cmp ? text_cmp : typeid(decltype(cmp)).name(), text_b ? text_b : typeid(decltype(std::forward<Tb>(b))).name());
+		mpt::test::result result;
+		try {
+			const auto va = std::forward<Ta>(a);
+			const auto vb = std::forward<Tb>(b);
+			if (!cmp(va, vb)) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{mpt::test::format(va) + " " + mpt::test::format(cmp) + " " + mpt::test::format(vb)};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+};
+
+
+} // namespace test
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_TEST_TEST_HPP

Property changes on: src/mpt/test/test.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/test/test_macros.hpp
===================================================================
--- src/mpt/test/test_macros.hpp	(nonexistent)
+++ src/mpt/test/test_macros.hpp	(working copy)
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_TEST_TEST_MACROS_HPP
+#define MPT_TEST_TEST_MACROS_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/preprocessor.hpp"
+#include "mpt/test/test.hpp"
+
+#include <functional>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace test {
+
+
+#define MPT_TEST_GROUP_BEGIN(name) \
+	inline mpt::test::group MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_name) { \
+		name, [](mpt::test::context & context) {
+#define MPT_TEST_GROUP_END() \
+	} \
+	} \
+	;
+
+// #define MPT_TEST_GROUP(name) inline void MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(mpt::test::context & context); inline mpt::test::group MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_name){name, [](mpt::test::context & context) { MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(context); }}; inline void MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(mpt::test::context & context)
+
+#define MPT_TEST_DELAYED(x) [&] { \
+	return x; \
+}
+
+#define MPT_TEST_EXPECT mpt::test::test{context}.expect
+
+#define MPT_TEST_EXPECT_EXPR(e)                 mpt::test::test{context}.expect([&] { return e; }, #e)
+#define MPT_TEST_EXPECT_CMP(a, cmp, b)          mpt::test::test{context}.expect([&] { return a; }, [](const auto & a_, const auto & b_) { return a_ cmp b_; }, [&] { return b; }, #a, #cmp, #b)
+#define MPT_TEST_EXPECT_THROWS_ANY(expr)        mpt::test::test{context}.expect_throws_any([&] { expr; }, #expr)
+#define MPT_TEST_EXPECT_THROWS(exception, expr) mpt::test::test{context}.expect_throws<exception>([&] { expr; }, #exception, #expr)
+
+#define MPT_TEST_EXPECT_EQUAL(a, b) mpt::test::test{context}.expect([&] { return a; }, std::equal_to<>{}, [&] { return b; }, #a, "==", #b)
+
+
+} // namespace test
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_TEST_TEST_MACROS_HPP

Property changes on: src/mpt/test/test_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/test/test.hpp
===================================================================
--- src/mpt/test/test.hpp	(nonexistent)
+++ src/mpt/test/test.hpp	(working copy)
@@ -0,0 +1,549 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_TEST_TEST_HPP
+#define MPT_TEST_TEST_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/source_location.hpp"
+
+#include <functional>
+#include <iostream>
+#include <map>
+#include <sstream>
+#include <stdexcept>
+#include <type_traits>
+#include <typeinfo>
+#include <utility>
+#include <variant>
+
+#include <cstddef>
+#include <cstdlib>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace test {
+
+
+
+template <typename S, typename T, typename = void>
+struct is_to_stream_writable : std::false_type { };
+
+template <typename S, typename T>
+struct is_to_stream_writable<S, T, std::void_t<decltype(std::declval<S &>() << std::declval<T>())>> : std::true_type { };
+
+template <typename T>
+inline auto format(const T & x) -> typename std::enable_if<mpt::test::is_to_stream_writable<std::ostringstream, T>::value, std::string>::type {
+	std::ostringstream s;
+	s << x;
+	return s.str();
+}
+
+template <typename T>
+inline auto format(const T & x) -> typename std::enable_if<!mpt::test::is_to_stream_writable<std::ostringstream, T>::value, std::string>::type {
+	return typeid(x).name();
+}
+
+inline std::string get_exception_text() {
+	std::string result;
+	try {
+		throw;
+	} catch (const std::exception & e) {
+		result = e.what();
+	} catch (...) {
+		result = "unknown exception";
+	}
+	return result;
+}
+
+struct result_success {
+};
+struct result_failure {
+	std::string text{};
+};
+struct result_unexpected_exception {
+	std::string text{};
+};
+
+struct result {
+	std::variant<std::monostate, result_success, result_failure, result_unexpected_exception> info{std::monostate{}};
+};
+
+struct statistics_counters {
+	std::size_t total{0};
+	std::size_t run{0};
+	std::size_t successes{0};
+	std::size_t failures{0};
+	std::size_t unexpected_exceptions{0};
+	std::size_t completed{0};
+	constexpr statistics_counters & operator+=(const statistics_counters & other) noexcept {
+		total += other.total;
+		run += other.run;
+		successes += other.successes;
+		failures += other.failures;
+		unexpected_exceptions += other.unexpected_exceptions;
+		completed += other.completed;
+		return *this;
+	}
+};
+
+struct group_statistics {
+	statistics_counters tests{};
+	statistics_counters cases{};
+	statistics_counters local_cases{};
+};
+
+struct global_statistics {
+	statistics_counters groups{};
+	statistics_counters tests{};
+	statistics_counters cases{};
+	std::map<std::string, group_statistics> individual_group_statistics{};
+	explicit constexpr operator bool() noexcept {
+		return succeeded();
+	}
+	constexpr bool operator!() noexcept {
+		return failed();
+	}
+	constexpr bool succeeded() noexcept {
+		return groups.successes == groups.run;
+	}
+	constexpr bool failed() noexcept {
+		return groups.failures > 0 || groups.unexpected_exceptions > 0;
+	}
+};
+
+class reporter_interface {
+protected:
+	virtual ~reporter_interface() = default;
+
+public:
+	virtual void run_begin(const mpt::source_location & loc) = 0;
+	virtual void group_begin(const mpt::source_location & loc, const char * name) = 0;
+	virtual void test_begin(const mpt::source_location & loc, const char * name) = 0;
+	virtual void case_run(const mpt::source_location & loc) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_e) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_ex, const char * text_e) = 0;
+	virtual void case_run(const mpt::source_location & loc, const char * text_a, const char * text_cmp, const char * text_b) = 0;
+	virtual void case_result(const mpt::source_location & loc, const mpt::test::result & result) = 0;
+	virtual void test_end(const mpt::source_location & loc, const char * name, const statistics_counters & counters) = 0;
+	virtual void group_end(const mpt::source_location & loc, const char * name, const group_statistics & statistics) = 0;
+	virtual void run_end(const mpt::source_location & loc, const global_statistics & statistics) = 0;
+	virtual void immediate_breakpoint() = 0;
+};
+
+class silent_reporter
+	: public reporter_interface {
+public:
+	silent_reporter() = default;
+	~silent_reporter() override = default;
+
+public:
+	virtual void run_begin(const mpt::source_location &) override {
+	}
+	virtual void group_begin(const mpt::source_location &, const char *) override {
+	}
+	virtual void test_begin(const mpt::source_location &, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *, const char *) override {
+	}
+	virtual void case_run(const mpt::source_location &, const char *, const char *, const char *) override {
+	}
+	virtual void case_result(const mpt::source_location &, const mpt::test::result &) override {
+	}
+	virtual void test_end(const mpt::source_location &, const char *, const statistics_counters &) override {
+	}
+	virtual void group_end(const mpt::source_location &, const char *, const group_statistics &) override {
+	}
+	virtual void run_end(const mpt::source_location &, const global_statistics &) override {
+	}
+	virtual void immediate_breakpoint() override {
+	}
+};
+
+class simple_reporter : public reporter_interface {
+private:
+	std::ostream & s;
+
+public:
+	simple_reporter(std::ostream & s_)
+		: s(s_) {
+		s.flush();
+	}
+	~simple_reporter() override {
+		s.flush();
+	}
+
+public:
+	void run_begin(const mpt::source_location & loc) override {
+		static_cast<void>(loc);
+		s << "Running test suite ..." << std::endl;
+	}
+	void group_begin(const mpt::source_location & loc, const char * name) override {
+		static_cast<void>(loc);
+		s << "Running group '" << name << "' ..." << std::endl;
+	}
+	void test_begin(const mpt::source_location & loc, const char * name) override {
+		static_cast<void>(loc);
+		s << " Running test '" << name << "' ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc) override {
+		static_cast<void>(loc);
+		s << "  Checking ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc, const char * text_e) override {
+		static_cast<void>(loc);
+		s << "  Checking '" << text_e << "' ..." << std::endl;
+	}
+	void case_run(const mpt::source_location & loc, const char * text_ex, const char * text_e) override {
+		static_cast<void>(loc);
+		if (text_ex) {
+			s << "  Checking '" << text_e << " throws " << text_ex << "' ..." << std::endl;
+		} else {
+			s << "  Checking '" << text_e << " throws' ..." << std::endl;
+		}
+	}
+	void case_run(const mpt::source_location & loc, const char * text_a, const char * text_cmp, const char * text_b) override {
+		static_cast<void>(loc);
+		s << "  Checking '" << text_a << " " << text_cmp << " " << text_b << "' ..." << std::endl;
+	}
+	void case_result(const mpt::source_location & loc, const mpt::test::result & result) override {
+		static_cast<void>(loc);
+		s << "  Checking done: ";
+		if (std::holds_alternative<result_success>(result.info)) {
+			s << "Success.";
+		} else if (std::holds_alternative<result_failure>(result.info)) {
+			s << "FAILURE: " << std::get<result_failure>(result.info).text;
+		} else if (std::holds_alternative<result_unexpected_exception>(result.info)) {
+			s << "UNEXPECTED EXCEPTION: " << std::get<result_unexpected_exception>(result.info).text;
+		}
+		s << std::endl;
+	}
+	void test_end(const mpt::source_location & loc, const char * name, const statistics_counters & counters) override {
+		static_cast<void>(loc);
+		static_cast<void>(counters);
+		s << " Running test '" << name << "' done." << std::endl;
+	}
+	void group_end(const mpt::source_location & loc, const char * name, const group_statistics & statistics) override {
+		static_cast<void>(loc);
+		static_cast<void>(statistics);
+		s << "Running group '" << name << "' done." << std::endl;
+	}
+	void run_end(const mpt::source_location & loc, const global_statistics & statistics) override {
+		static_cast<void>(loc);
+		s << "Running test suite done." << std::endl;
+		s << "groups: " << statistics.groups.total << " | " << statistics.groups.successes << " passed";
+		if (statistics.groups.failures || statistics.groups.unexpected_exceptions) {
+			s << " | " << statistics.groups.failures << " FAILED";
+			if (statistics.groups.unexpected_exceptions) {
+				s << " | " << statistics.groups.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+		s << "tests: " << statistics.tests.total << " | " << statistics.tests.successes << " passed";
+		if (statistics.tests.failures || statistics.tests.unexpected_exceptions) {
+			s << " | " << statistics.tests.failures << " FAILED";
+			if (statistics.tests.unexpected_exceptions) {
+				s << " | " << statistics.tests.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+		s << "checks: " << statistics.cases.total << " | " << statistics.cases.successes << " passed";
+		if (statistics.cases.failures || statistics.cases.unexpected_exceptions) {
+			s << " | " << statistics.cases.failures << " FAILED";
+			if (statistics.cases.unexpected_exceptions) {
+				s << " | " << statistics.cases.unexpected_exceptions << " UNEXPECTED EXCEPTIONS";
+			}
+		}
+		s << std::endl;
+	}
+	void immediate_breakpoint() override {
+		return;
+	}
+};
+
+struct group;
+
+struct context {
+	mpt::test::group & group;
+	mpt::test::reporter_interface & reporter;
+	mpt::test::group_statistics statistics{};
+};
+
+using void_context_function = void (*)(mpt::test::context &);
+
+struct group {
+	group * next{nullptr};
+	const char * name{""};
+	void_context_function func{nullptr};
+	inline group(const char * name_, void_context_function f)
+		: name(name_)
+		, func(f) {
+		next = group_list();
+		group_list() = this;
+	}
+	group_statistics run(mpt::test::reporter_interface & reporter, const mpt::source_location & loc = mpt::source_location::current()) {
+		mpt::test::context context{*this, reporter};
+		context.reporter.group_begin(loc, name);
+		if (func) {
+			func(context);
+		}
+		context.reporter.group_end(loc, name, context.statistics);
+		return context.statistics;
+	}
+
+public:
+	[[nodiscard]] static inline group *& group_list() noexcept {
+		static group * group_list = nullptr;
+		return group_list;
+	}
+};
+
+inline global_statistics run_all(mpt::test::reporter_interface & reporter, const mpt::source_location & loc = mpt::source_location::current()) {
+	global_statistics statistics{};
+	reporter.run_begin(loc);
+	for (group * g = group::group_list(); g; g = g->next) {
+		statistics.groups.total++;
+		statistics.groups.run++;
+		group_statistics s = g->run(reporter, loc);
+		if (s.tests.unexpected_exceptions) {
+			statistics.groups.unexpected_exceptions++;
+		} else if (s.tests.failures) {
+			statistics.groups.failures++;
+		} else {
+			statistics.groups.successes++;
+		}
+		statistics.tests += s.tests;
+		statistics.cases += s.cases;
+		statistics.groups.completed++;
+		statistics.individual_group_statistics[g->name] = s;
+	}
+	reporter.run_end(loc, statistics);
+	return statistics;
+}
+
+struct test {
+
+	mpt::test::context & context;
+	const char * name{""};
+	mpt::source_location source_location{mpt::source_location::current()};
+	void (*breakpoint)(void){nullptr};
+
+	test(const test &) = delete;
+	test & operator=(const test &) = delete;
+
+	inline test(mpt::test::context & context_, void (*breakpoint_)(void) = nullptr, const mpt::source_location & source_location_ = mpt::source_location::current())
+		: context(context_)
+		, source_location(source_location_)
+		, breakpoint(breakpoint_) {
+		report_test_begin();
+	}
+	inline test(mpt::test::context & context_, const char * name_, void (*breakpoint_)(void) = nullptr, const mpt::source_location & source_location_ = mpt::source_location::current())
+		: context(context_)
+		, name(name_)
+		, source_location(source_location_)
+		, breakpoint(breakpoint_) {
+		report_test_begin();
+	}
+
+	inline ~test() {
+		report_test_end();
+	}
+
+	void immediate_breakpoint() {
+		if (breakpoint) {
+			breakpoint();
+		} else {
+			context.reporter.immediate_breakpoint();
+		}
+	}
+
+	void report_test_begin() {
+		context.statistics.tests.total++;
+		context.statistics.tests.run++;
+		context.statistics.local_cases = statistics_counters{};
+		context.reporter.test_begin(source_location, name);
+	}
+
+	void report_run() {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location);
+	}
+	void report_run(const char * text_e) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_e);
+	}
+	void report_run(const char * text_ex, const char * text_e) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_ex, text_e);
+	}
+	void report_run(const char * text_a, const char * text_cmp, const char * text_b) {
+		context.statistics.local_cases.total++;
+		context.statistics.local_cases.run++;
+		context.reporter.case_run(source_location, text_a, text_cmp, text_b);
+	}
+
+	void report_result(mpt::test::result result) {
+		if (std::holds_alternative<result_success>(result.info)) {
+			context.statistics.local_cases.successes++;
+		} else if (std::holds_alternative<result_failure>(result.info)) {
+			context.statistics.local_cases.failures++;
+		} else if (std::holds_alternative<result_unexpected_exception>(result.info)) {
+			context.statistics.local_cases.unexpected_exceptions++;
+		}
+		context.statistics.local_cases.completed++;
+		context.reporter.case_result(source_location, result);
+	}
+
+	void report_test_end() {
+		context.statistics.cases += context.statistics.local_cases;
+		if (context.statistics.local_cases.unexpected_exceptions) {
+			context.statistics.tests.unexpected_exceptions++;
+		} else if (context.statistics.local_cases.failures) {
+			context.statistics.tests.failures++;
+		} else {
+			context.statistics.tests.successes++;
+		}
+		context.statistics.tests.completed++;
+		context.reporter.test_end(source_location, name, context.statistics.local_cases);
+	}
+
+	template <typename Texception, typename Tcallable, typename std::enable_if<std::is_invocable<Tcallable>::value, bool>::type = true>
+	inline test & expect_throws(Tcallable c, const char * text_ex = nullptr, const char * text_e = nullptr) {
+		report_run(text_ex ? text_ex : typeid(Texception).name(), text_e ? text_e : typeid(decltype(c())).name());
+		mpt::test::result result;
+		try {
+			c();
+			immediate_breakpoint();
+			result.info = mpt::test::result_failure{};
+		} catch (const Texception &) {
+			result.info = mpt::test::result_success{};
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Tcallable, typename std::enable_if<std::is_invocable<Tcallable>::value, bool>::type = true>
+	inline test & expect_throws_any(Tcallable c, const char * text_e = nullptr) {
+		report_run(nullptr, text_e ? text_e : typeid(decltype(c())).name());
+		mpt::test::result result;
+		try {
+			c();
+			immediate_breakpoint();
+			result.info = mpt::test::result_failure{};
+		} catch (...) {
+			result.info = mpt::test::result_success{};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Texpr, typename std::enable_if<std::is_invocable<Texpr>::value, bool>::type = true>
+	inline test & expect(Texpr e, const char * text_e = nullptr) {
+		report_run(text_e ? text_e : typeid(decltype(std::invoke(e))).name());
+		mpt::test::result result;
+		try {
+			const auto ve = std::invoke(e);
+			if (!ve) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{/*mpt::test::format(ve)*/};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Ta, typename Tcmp, typename Tb, typename std::enable_if<std::is_invocable<Ta>::value, bool>::type = true, typename std::enable_if<std::is_invocable<Tb>::value, bool>::type = true>
+	inline test & expect(Ta && a, Tcmp cmp, Tb && b, const char * text_a = nullptr, const char * text_cmp = nullptr, const char * text_b = nullptr) {
+		report_run(text_a ? text_a : typeid(decltype(std::invoke(a))).name(), text_cmp ? text_cmp : typeid(decltype(cmp)).name(), text_b ? text_b : typeid(decltype(std::invoke(b))).name());
+		mpt::test::result result;
+		try {
+			const auto va = std::invoke(a);
+			const auto vb = std::invoke(b);
+			if (!cmp(va, vb)) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{mpt::test::format(va) + " " + mpt::test::format(cmp) + " " + mpt::test::format(vb)};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Texpr, typename std::enable_if<!std::is_invocable<Texpr>::value, bool>::type = true>
+	inline test & expect(Texpr && e, const char * text_e = nullptr) {
+		report_run(text_e ? text_e : typeid(decltype(std::forward<Texpr>(e))).name());
+		mpt::test::result result;
+		try {
+			const auto ve = std::forward<Texpr>(e);
+			if (!ve) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{/*mpt::test::format(ve)*/};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+
+	template <typename Ta, typename Tcmp, typename Tb, typename std::enable_if<!std::is_invocable<Ta>::value, bool>::type = true, typename std::enable_if<!std::is_invocable<Tb>::value, bool>::type = true>
+	inline test & expect(Ta && a, Tcmp cmp, Tb && b, const char * text_a = nullptr, const char * text_cmp = nullptr, const char * text_b = nullptr) {
+		report_run(text_a ? text_a : typeid(decltype(std::forward<Ta>(a))).name(), text_cmp ? text_cmp : typeid(decltype(cmp)).name(), text_b ? text_b : typeid(decltype(std::forward<Tb>(b))).name());
+		mpt::test::result result;
+		try {
+			const auto va = std::forward<Ta>(a);
+			const auto vb = std::forward<Tb>(b);
+			if (!cmp(va, vb)) {
+				immediate_breakpoint();
+				result.info = mpt::test::result_failure{mpt::test::format(va) + " " + mpt::test::format(cmp) + " " + mpt::test::format(vb)};
+			} else {
+				result.info = mpt::test::result_success{};
+			}
+		} catch (...) {
+			immediate_breakpoint();
+			result.info = mpt::test::result_unexpected_exception{mpt::test::get_exception_text()};
+		}
+		report_result(result);
+		return *this;
+	}
+};
+
+
+} // namespace test
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_TEST_TEST_HPP

Property changes on: src/mpt/test/test.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/test/test_macros.hpp
===================================================================
--- src/mpt/test/test_macros.hpp	(nonexistent)
+++ src/mpt/test/test_macros.hpp	(working copy)
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_TEST_TEST_MACROS_HPP
+#define MPT_TEST_TEST_MACROS_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/base/preprocessor.hpp"
+#include "mpt/test/test.hpp"
+
+#include <functional>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+namespace test {
+
+
+#define MPT_TEST_GROUP_BEGIN(name) \
+	inline mpt::test::group MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_name) { \
+		name, [](mpt::test::context & context) {
+#define MPT_TEST_GROUP_END() \
+	} \
+	} \
+	;
+
+// #define MPT_TEST_GROUP(name) inline void MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(mpt::test::context & context); inline mpt::test::group MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_name){name, [](mpt::test::context & context) { MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(context); }}; inline void MPT_PP_UNIQUE_IDENTIFIER(mpt_test_group_func)(mpt::test::context & context)
+
+#define MPT_TEST_DELAYED(x) [&] { \
+	return x; \
+}
+
+#define MPT_TEST_EXPECT mpt::test::test{context}.expect
+
+#define MPT_TEST_EXPECT_EXPR(e)                 mpt::test::test{context}.expect([&] { return e; }, #e)
+#define MPT_TEST_EXPECT_CMP(a, cmp, b)          mpt::test::test{context}.expect([&] { return a; }, [](const auto & a_, const auto & b_) { return a_ cmp b_; }, [&] { return b; }, #a, #cmp, #b)
+#define MPT_TEST_EXPECT_THROWS_ANY(expr)        mpt::test::test{context}.expect_throws_any([&] { expr; }, #expr)
+#define MPT_TEST_EXPECT_THROWS(exception, expr) mpt::test::test{context}.expect_throws<exception>([&] { expr; }, #exception, #expr)
+
+#define MPT_TEST_EXPECT_EQUAL(a, b) mpt::test::test{context}.expect([&] { return a; }, std::equal_to<>{}, [&] { return b; }, #a, "==", #b)
+
+
+} // namespace test
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_TEST_TEST_MACROS_HPP

Property changes on: src/mpt/test/test_macros.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/guid.hpp
===================================================================
--- src/mpt/uuid/guid.hpp	(nonexistent)
+++ src/mpt/uuid/guid.hpp	(working copy)
@@ -0,0 +1,284 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_GUID_HPP
+#define MPT_UUID_GUID_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <stdexcept>
+#include <vector>
+
+#if MPT_OS_WINDOWS
+#include <guiddef.h>
+#include <objbase.h>
+#include <rpc.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+
+// COM CLSID<->string conversion
+// A CLSID string is not necessarily a standard UUID string,
+// it might also be a symbolic name for the interface.
+// (see CLSIDFromString ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms680589%28v=vs.85%29.aspx ))
+
+inline mpt::winstring CLSIDToString(CLSID clsid) {
+	std::wstring str;
+	LPOLESTR tmp = nullptr;
+	switch (::StringFromCLSID(clsid, &tmp)) {
+		case S_OK:
+			break;
+		case E_OUTOFMEMORY:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			mpt::throw_out_of_memory();
+			break;
+		default:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			throw std::logic_error("StringFromCLSID() failed.");
+			break;
+	}
+	if (!tmp) {
+		throw std::logic_error("StringFromCLSID() failed.");
+	}
+	try {
+		str = tmp;
+	} catch (mpt::out_of_memory e) {
+		::CoTaskMemFree(tmp);
+		tmp = nullptr;
+		mpt::rethrow_out_of_memory(e);
+	}
+	::CoTaskMemFree(tmp);
+	tmp = nullptr;
+	return mpt::convert<mpt::winstring>(str);
+}
+
+inline CLSID StringToCLSID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	CLSID clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			// nothing
+			break;
+		case E_INVALIDARG:
+			clsid = CLSID();
+			break;
+		case CO_E_CLASSSTRING:
+			clsid = CLSID();
+			break;
+		case REGDB_E_CLASSNOTREG:
+			clsid = CLSID();
+			break;
+		case REGDB_E_READREGDB:
+			clsid = CLSID();
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			clsid = CLSID();
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return clsid;
+}
+
+inline bool VerifyStringToCLSID(const mpt::winstring & str_, CLSID & clsid) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	bool result = false;
+	clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			result = true;
+			break;
+		case E_INVALIDARG:
+			result = false;
+			break;
+		case CO_E_CLASSSTRING:
+			result = false;
+			break;
+		case REGDB_E_CLASSNOTREG:
+			result = false;
+			break;
+		case REGDB_E_READREGDB:
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return result;
+}
+
+inline bool IsCLSID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	bool result = false;
+	CLSID clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			result = true;
+			break;
+		case E_INVALIDARG:
+			result = false;
+			break;
+		case CO_E_CLASSSTRING:
+			result = false;
+			break;
+		case REGDB_E_CLASSNOTREG:
+			result = false;
+			break;
+		case REGDB_E_READREGDB:
+			result = false;
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			result = false;
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return result;
+}
+
+
+// COM IID<->string conversion
+
+inline IID StringToIID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	IID iid = IID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::IIDFromString(tmp.data(), &iid)) {
+		case S_OK:
+			// nothing
+			break;
+		case E_OUTOFMEMORY:
+			iid = IID();
+			mpt::throw_out_of_memory();
+			break;
+		case E_INVALIDARG:
+			iid = IID();
+			break;
+		default:
+			iid = IID();
+			throw std::logic_error("IIDFromString() failed.");
+			break;
+	}
+	return iid;
+}
+
+inline mpt::winstring IIDToString(IID iid) {
+	std::wstring str;
+	LPOLESTR tmp = nullptr;
+	switch (::StringFromIID(iid, &tmp)) {
+		case S_OK:
+			break;
+		case E_OUTOFMEMORY:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			mpt::throw_out_of_memory();
+			break;
+		default:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			throw std::logic_error("StringFromIID() failed.");
+			break;
+	}
+	if (!tmp) {
+		throw std::logic_error("StringFromIID() failed.");
+	}
+	try {
+		str = tmp;
+	} catch (mpt::out_of_memory e) {
+		::CoTaskMemFree(tmp);
+		tmp = nullptr;
+		mpt::rethrow_out_of_memory(e);
+	}
+	return mpt::convert<mpt::winstring>(str);
+}
+
+
+// General GUID<->string conversion.
+// The string must/will be in standard GUID format: {4F9A455D-E7EF-4367-B2F0-0C83A38A5C72}
+
+inline GUID StringToGUID(const mpt::winstring & str) {
+	return StringToIID(str);
+}
+
+inline mpt::winstring GUIDToString(GUID guid) {
+	std::vector<OLECHAR> tmp(256);
+	if (::StringFromGUID2(guid, tmp.data(), static_cast<int>(tmp.size())) <= 0) {
+		throw std::logic_error("StringFromGUID2() failed.");
+	}
+	return mpt::convert<mpt::winstring>(tmp.data());
+}
+
+
+// Create a COM GUID
+
+inline GUID CreateGUID() {
+	GUID guid = GUID();
+	switch (::CoCreateGuid(&guid)) {
+		case S_OK:
+			// nothing
+			break;
+		default:
+			guid = GUID();
+			throw std::runtime_error("CoCreateGuid() failed.");
+	}
+	return guid;
+}
+
+
+// Checks the UUID against the NULL UUID. Returns false if it is NULL, true otherwise.
+
+inline bool IsValid(::UUID uuid) {
+	return false
+		|| uuid.Data1 != 0
+		|| uuid.Data2 != 0
+		|| uuid.Data3 != 0
+		|| uuid.Data4[0] != 0
+		|| uuid.Data4[1] != 0
+		|| uuid.Data4[2] != 0
+		|| uuid.Data4[3] != 0
+		|| uuid.Data4[4] != 0
+		|| uuid.Data4[5] != 0
+		|| uuid.Data4[6] != 0
+		|| uuid.Data4[7] != 0;
+}
+
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_GUID_HPP

Property changes on: src/mpt/uuid/guid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/tests/tests_uuid.hpp
===================================================================
--- src/mpt/uuid/tests/tests_uuid.hpp	(nonexistent)
+++ src/mpt/uuid/tests/tests_uuid.hpp	(working copy)
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_UUID_HPP
+#define MPT_BASE_TESTS_UUID_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+#include "mpt/uuid/guid.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <cstddef>
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_uuid{
+	"mpt/uuid",
+	[](mpt::test::context & context) {
+		using namespace mpt::uuid_literals;
+
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull).ToUString(), MPT_USTRING("2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"));
+#if MPT_OS_WINDOWS
+		constexpr mpt::UUID uuid_tmp = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid_tmp);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(mpt::StringToGUID(TEXT("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(mpt::StringToCLSID(TEXT("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull), mpt::UUID(mpt::StringToGUID(TEXT("{00112233-4455-6677-8899-AABBCCDDEEFF}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull), mpt::UUID(mpt::StringToGUID(TEXT("{00112233-4455-6677-C899-AABBCCDDEEFF}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull)), TEXT("{00112233-4455-6677-8899-AABBCCDDEEFF}"));
+		MPT_TEST_EXPECT_EQUAL(mpt::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull)), TEXT("{00112233-4455-6677-C899-AABBCCDDEEFF}"));
+#endif // MPT_OS_WINDOWS
+
+		mpt::sane_random_device rd;
+		mpt::good_engine prng = mpt::make_prng<mpt::good_engine>(rd);
+
+#if MPT_OS_WINDOWS
+		MPT_TEST_EXPECT_EQUAL(mpt::IsValid(mpt::CreateGUID()), true);
+		{
+			mpt::UUID uuid = mpt::UUID::Generate(prng);
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID::FromString(mpt::UUID(uuid).ToUString()));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToGUID(mpt::GUIDToString(uuid))));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToIID(mpt::IIDToString(uuid))));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToCLSID(mpt::CLSIDToString(uuid))));
+		}
+		{
+			GUID guid = mpt::UUID::Generate(prng);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, static_cast<GUID>(mpt::UUID::FromString(mpt::UUID(guid).ToUString()))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToGUID(mpt::GUIDToString(guid))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToIID(mpt::IIDToString(guid))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToCLSID(mpt::CLSIDToString(guid))), TRUE);
+		}
+#endif // MPT_OS_WINDOWS
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::Generate(prng).IsValid(), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::GenerateLocalUseOnly(prng).IsValid(), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::Generate(prng) != mpt::UUID::Generate(prng), true);
+		mpt::UUID a = mpt::UUID::Generate(prng);
+		MPT_TEST_EXPECT_EQUAL(a, mpt::UUID::FromString(a.ToUString()));
+		std::byte uuiddata[16]{};
+		for (std::size_t i = 0; i < 16; ++i) {
+			uuiddata[i] = mpt::byte_cast<std::byte>(static_cast<uint8>(i));
+		}
+		static_assert(sizeof(mpt::UUID) == 16);
+		mpt::UUIDbin uuid2;
+		std::memcpy(&uuid2, uuiddata, 16);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(uuid2).ToUString(), MPT_USTRING("00010203-0405-0607-0809-0a0b0c0d0e0f"));
+
+		constexpr mpt::UUID uuid3 = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid3);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_UUID_HPP

Property changes on: src/mpt/uuid/tests/tests_uuid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/uuid.hpp
===================================================================
--- src/mpt/uuid/uuid.hpp	(nonexistent)
+++ src/mpt/uuid/uuid.hpp	(working copy)
@@ -0,0 +1,386 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_UUID_HPP
+#define MPT_UUID_UUID_HPP
+
+
+
+#include "mpt/base/constexpr_throw.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/random/random.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/parse.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#if MPT_OS_WINDOWS
+#include <guiddef.h>
+#include <objbase.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Microsoft on-disk layout
+struct GUIDms {
+	uint32le Data1;
+	uint16le Data2;
+	uint16le Data3;
+	uint64be Data4; // yes, big endian here
+};
+constexpr bool declare_binary_safe(const GUIDms &) {
+	return true;
+}
+static_assert(mpt::check_binary_size<GUIDms>(16));
+
+// RFC binary format
+struct UUIDbin {
+	uint32be Data1;
+	uint16be Data2;
+	uint16be Data3;
+	uint64be Data4;
+};
+constexpr bool declare_binary_safe(const UUIDbin &) {
+	return true;
+}
+static_assert(mpt::check_binary_size<UUIDbin>(16));
+
+
+
+struct UUID {
+private:
+	uint32 Data1;
+	uint16 Data2;
+	uint16 Data3;
+	uint64 Data4;
+
+public:
+	MPT_CONSTEXPRINLINE uint32 GetData1() const noexcept {
+		return Data1;
+	}
+	MPT_CONSTEXPRINLINE uint16 GetData2() const noexcept {
+		return Data2;
+	}
+	MPT_CONSTEXPRINLINE uint16 GetData3() const noexcept {
+		return Data3;
+	}
+	MPT_CONSTEXPRINLINE uint64 GetData4() const noexcept {
+		return Data4;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE uint64 GetData64_1() const noexcept {
+		return (static_cast<uint64>(Data1) << 32) | (static_cast<uint64>(Data2) << 16) | (static_cast<uint64>(Data3) << 0);
+	}
+	MPT_CONSTEXPRINLINE uint64 GetData64_2() const noexcept {
+		return Data4;
+	}
+
+public:
+	// xxxxxxxx-xxxx-Mmxx-Nnxx-xxxxxxxxxxxx
+	// <--32-->-<16>-<16>-<-------64------>
+	MPT_CONSTEXPRINLINE bool IsNil() const noexcept {
+		return (Data1 == 0) && (Data2 == 0) && (Data3 == 0) && (Data4 == 0);
+	}
+	MPT_CONSTEXPRINLINE bool IsValid() const noexcept {
+		return (Data1 != 0) || (Data2 != 0) || (Data3 != 0) || (Data4 != 0);
+	}
+	MPT_CONSTEXPRINLINE uint8 Variant() const noexcept {
+		return Nn() >> 4u;
+	}
+	MPT_CONSTEXPRINLINE uint8 Version() const noexcept {
+		return Mm() >> 4u;
+	}
+	MPT_CONSTEXPRINLINE bool IsRFC4122() const noexcept {
+		return (Variant() & 0xcu) == 0x8u;
+	}
+
+private:
+	MPT_CONSTEXPRINLINE uint8 Mm() const noexcept {
+		return static_cast<uint8>((Data3 >> 8) & 0xffu);
+	}
+	MPT_CONSTEXPRINLINE uint8 Nn() const noexcept {
+		return static_cast<uint8>((Data4 >> 56) & 0xffu);
+	}
+	void MakeRFC4122(uint8 version) noexcept {
+		// variant
+		uint8 Nn = static_cast<uint8>((Data4 >> 56) & 0xffu);
+		Data4 &= 0x00ffffffffffffffull;
+		Nn &= ~(0xc0u);
+		Nn |= 0x80u;
+		Data4 |= static_cast<uint64>(Nn) << 56;
+		// version
+		version &= 0x0fu;
+		uint8 Mm = static_cast<uint8>((Data3 >> 8) & 0xffu);
+		Data3 &= 0x00ffu;
+		Mm &= ~(0xf0u);
+		Mm |= (version << 4u);
+		Data3 |= static_cast<uint16>(Mm) << 8;
+	}
+#if MPT_OS_WINDOWS
+private:
+	static mpt::UUID UUIDFromWin32(::UUID uuid) {
+		return mpt::UUID(uuid.Data1, uuid.Data2, uuid.Data3, (static_cast<uint64>(0) | (static_cast<uint64>(uuid.Data4[0]) << 56) | (static_cast<uint64>(uuid.Data4[1]) << 48) | (static_cast<uint64>(uuid.Data4[2]) << 40) | (static_cast<uint64>(uuid.Data4[3]) << 32) | (static_cast<uint64>(uuid.Data4[4]) << 24) | (static_cast<uint64>(uuid.Data4[5]) << 16) | (static_cast<uint64>(uuid.Data4[6]) << 8) | (static_cast<uint64>(uuid.Data4[7]) << 0)));
+	}
+	static ::UUID UUIDToWin32(mpt::UUID uuid) {
+		::UUID result = ::UUID();
+		result.Data1 = uuid.GetData1();
+		result.Data2 = uuid.GetData2();
+		result.Data3 = uuid.GetData3();
+		result.Data4[0] = static_cast<uint8>(uuid.GetData4() >> 56);
+		result.Data4[1] = static_cast<uint8>(uuid.GetData4() >> 48);
+		result.Data4[2] = static_cast<uint8>(uuid.GetData4() >> 40);
+		result.Data4[3] = static_cast<uint8>(uuid.GetData4() >> 32);
+		result.Data4[4] = static_cast<uint8>(uuid.GetData4() >> 24);
+		result.Data4[5] = static_cast<uint8>(uuid.GetData4() >> 16);
+		result.Data4[6] = static_cast<uint8>(uuid.GetData4() >> 8);
+		result.Data4[7] = static_cast<uint8>(uuid.GetData4() >> 0);
+		return result;
+	}
+
+public:
+	explicit UUID(::UUID uuid) {
+		*this = UUIDFromWin32(uuid);
+	}
+	operator ::UUID() const {
+		return UUIDToWin32(*this);
+	}
+#endif // MPT_OS_WINDOWS
+private:
+	static MPT_CONSTEXPRINLINE uint8 NibbleFromChar(char x) {
+		return ('0' <= x && x <= '9') ? static_cast<uint8>(x - '0' + 0) : ('a' <= x && x <= 'z') ? static_cast<uint8>(x - 'a' + 10)
+			: ('A' <= x && x <= 'Z')                                                             ? static_cast<uint8>(x - 'A' + 10)
+																								 : mpt::constexpr_throw<uint8>(std::domain_error(""));
+	}
+	static MPT_CONSTEXPRINLINE uint8 ByteFromHex(char x, char y) {
+		return static_cast<uint8>(uint8(0) | (NibbleFromChar(x) << 4) | (NibbleFromChar(y) << 0));
+	}
+	static MPT_CONSTEXPRINLINE uint16 ParseHex16(const char * str) {
+		return static_cast<uint16>(uint16(0) | (static_cast<uint16>(ByteFromHex(str[0], str[1])) << 8) | (static_cast<uint16>(ByteFromHex(str[2], str[3])) << 0));
+	}
+	static MPT_CONSTEXPRINLINE uint32 ParseHex32(const char * str) {
+		return static_cast<uint32>(uint32(0) | (static_cast<uint32>(ByteFromHex(str[0], str[1])) << 24) | (static_cast<uint32>(ByteFromHex(str[2], str[3])) << 16) | (static_cast<uint32>(ByteFromHex(str[4], str[5])) << 8) | (static_cast<uint32>(ByteFromHex(str[6], str[7])) << 0));
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE UUID ParseLiteral(const char * str, std::size_t len) {
+		return (len == 36 && str[8] == '-' && str[13] == '-' && str[18] == '-' && str[23] == '-') ? mpt::UUID(
+				   ParseHex32(str + 0),
+				   ParseHex16(str + 9),
+				   ParseHex16(str + 14),
+				   uint64(0)
+					   | (static_cast<uint64>(ParseHex16(str + 19)) << 48)
+					   | (static_cast<uint64>(ParseHex16(str + 24)) << 32)
+					   | (static_cast<uint64>(ParseHex32(str + 28)) << 0))
+																								  : mpt::constexpr_throw<mpt::UUID>(std::domain_error(""));
+	}
+
+public:
+	MPT_CONSTEXPRINLINE UUID() noexcept
+		: Data1(0)
+		, Data2(0)
+		, Data3(0)
+		, Data4(0) {
+		return;
+	}
+	MPT_CONSTEXPRINLINE explicit UUID(uint32 Data1, uint16 Data2, uint16 Data3, uint64 Data4) noexcept
+		: Data1(Data1)
+		, Data2(Data2)
+		, Data3(Data3)
+		, Data4(Data4) {
+		return;
+	}
+	explicit UUID(UUIDbin uuid) {
+		Data1 = uuid.Data1.get();
+		Data2 = uuid.Data2.get();
+		Data3 = uuid.Data3.get();
+		Data4 = uuid.Data4.get();
+	}
+	explicit UUID(GUIDms guid) {
+		Data1 = guid.Data1.get();
+		Data2 = guid.Data2.get();
+		Data3 = guid.Data3.get();
+		Data4 = guid.Data4.get();
+	}
+	operator UUIDbin() const {
+		UUIDbin result{};
+		result.Data1 = GetData1();
+		result.Data2 = GetData2();
+		result.Data3 = GetData3();
+		result.Data4 = GetData4();
+		return result;
+	}
+	operator GUIDms() const {
+		GUIDms result{};
+		result.Data1 = GetData1();
+		result.Data2 = GetData2();
+		result.Data3 = GetData3();
+		result.Data4 = GetData4();
+		return result;
+	}
+
+public:
+	// Create a UUID
+	template <typename Trng>
+	static UUID Generate(Trng & rng) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+#if (_WIN32_WINNT >= 0x0602)
+		::GUID guid = ::GUID();
+		HRESULT result = CoCreateGuid(&guid);
+		if (result != S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(guid);
+#else
+		return mpt::UUID::RFC4122Random(rng);
+#endif
+#elif MPT_OS_WINDOWS && !MPT_OS_WINDOWS_WINRT
+		::UUID uuid = ::UUID();
+		RPC_STATUS status = ::UuidCreate(&uuid);
+		if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		status = RPC_S_OK;
+		if (UuidIsNil(&uuid, &status) != FALSE) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		if (status != RPC_S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(uuid);
+#else
+		return RFC4122Random(rng);
+#endif
+	}
+	// Create a UUID that contains local, traceable information.
+	// Safe for local use. May be faster.
+	template <typename Trng>
+	static UUID GenerateLocalUseOnly(Trng & rng) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+#if (_WIN32_WINNT >= 0x0602)
+		::GUID guid = ::GUID();
+		HRESULT result = CoCreateGuid(&guid);
+		if (result != S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(guid);
+#else
+		return mpt::UUID::RFC4122Random(rng);
+#endif
+#elif MPT_OS_WINDOWS && !MPT_OS_WINDOWS_WINRT
+#if _WIN32_WINNT >= 0x0501
+		// Available since Win2000, but we check for WinXP in order to not use this
+		// function in Win32old builds. It is not available on some non-fully
+		// patched Win98SE installs in the wild.
+		::UUID uuid = ::UUID();
+		RPC_STATUS status = ::UuidCreateSequential(&uuid);
+		if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) {
+			return Generate(rng);
+		}
+		status = RPC_S_OK;
+		if (UuidIsNil(&uuid, &status) != FALSE) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		if (status != RPC_S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(uuid);
+#else
+		// Fallback to ::UuidCreate is safe as ::UuidCreateSequential is only a
+		// tiny performance optimization.
+		return Generate(rng);
+#endif
+#else
+		return RFC4122Random(rng);
+#endif
+	}
+	// Create a RFC4122 Random UUID.
+	template <typename Trng>
+	static UUID RFC4122Random(Trng & prng) {
+		UUID result;
+		result.Data1 = mpt::random<uint32>(prng);
+		result.Data2 = mpt::random<uint16>(prng);
+		result.Data3 = mpt::random<uint16>(prng);
+		result.Data4 = mpt::random<uint64>(prng);
+		result.MakeRFC4122(4);
+		return result;
+	}
+	friend UUID UUIDRFC4122NamespaceV3(const UUID & ns, const mpt::ustring & name);
+	friend UUID UUIDRFC4122NamespaceV5(const UUID & ns, const mpt::ustring & name);
+
+public:
+	// General UUID<->string conversion.
+	// The string must/will be in standard UUID format: 4f9a455d-e7ef-4367-b2f0-0c83a38a5c72
+	static UUID FromString(const mpt::ustring & str) {
+		std::vector<mpt::ustring> segments = mpt::split<mpt::ustring>(str, MPT_ULITERAL("-"));
+		if (segments.size() != 5) {
+			return UUID();
+		}
+		if (segments[0].length() != 8) {
+			return UUID();
+		}
+		if (segments[1].length() != 4) {
+			return UUID();
+		}
+		if (segments[2].length() != 4) {
+			return UUID();
+		}
+		if (segments[3].length() != 4) {
+			return UUID();
+		}
+		if (segments[4].length() != 12) {
+			return UUID();
+		}
+		UUID result;
+		result.Data1 = mpt::ConvertHexStringTo<uint32>(segments[0]);
+		result.Data2 = mpt::ConvertHexStringTo<uint16>(segments[1]);
+		result.Data3 = mpt::ConvertHexStringTo<uint16>(segments[2]);
+		result.Data4 = mpt::ConvertHexStringTo<uint64>(segments[3] + segments[4]);
+		return result;
+	}
+	mpt::ustring ToUString() const {
+		return mpt::ustring()
+			+ mpt::format<mpt::ustring>::hex0<8>(GetData1())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(GetData2())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(GetData3())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 48))
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 32))
+			+ mpt::format<mpt::ustring>::hex0<8>(static_cast<uint32>(GetData4() >> 0));
+	}
+};
+
+MPT_CONSTEXPRINLINE bool operator==(const mpt::UUID & a, const mpt::UUID & b) noexcept {
+	return (a.GetData1() == b.GetData1()) && (a.GetData2() == b.GetData2()) && (a.GetData3() == b.GetData3()) && (a.GetData4() == b.GetData4());
+}
+
+MPT_CONSTEXPRINLINE bool operator!=(const mpt::UUID & a, const mpt::UUID & b) noexcept {
+	return (a.GetData1() != b.GetData1()) || (a.GetData2() != b.GetData2()) || (a.GetData3() != b.GetData3()) || (a.GetData4() != b.GetData4());
+}
+
+
+namespace uuid_literals {
+
+MPT_CONSTEXPRINLINE mpt::UUID operator"" _uuid(const char * str, std::size_t len) {
+	return mpt::UUID::ParseLiteral(str, len);
+}
+
+} // namespace uuid_literals
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_UUID_HPP

Property changes on: src/mpt/uuid/uuid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/guid.hpp
===================================================================
--- src/mpt/uuid/guid.hpp	(nonexistent)
+++ src/mpt/uuid/guid.hpp	(working copy)
@@ -0,0 +1,284 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_GUID_HPP
+#define MPT_UUID_GUID_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/out_of_memory/out_of_memory.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <stdexcept>
+#include <vector>
+
+#if MPT_OS_WINDOWS
+#include <guiddef.h>
+#include <objbase.h>
+#include <rpc.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+
+
+// COM CLSID<->string conversion
+// A CLSID string is not necessarily a standard UUID string,
+// it might also be a symbolic name for the interface.
+// (see CLSIDFromString ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms680589%28v=vs.85%29.aspx ))
+
+inline mpt::winstring CLSIDToString(CLSID clsid) {
+	std::wstring str;
+	LPOLESTR tmp = nullptr;
+	switch (::StringFromCLSID(clsid, &tmp)) {
+		case S_OK:
+			break;
+		case E_OUTOFMEMORY:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			mpt::throw_out_of_memory();
+			break;
+		default:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			throw std::logic_error("StringFromCLSID() failed.");
+			break;
+	}
+	if (!tmp) {
+		throw std::logic_error("StringFromCLSID() failed.");
+	}
+	try {
+		str = tmp;
+	} catch (mpt::out_of_memory e) {
+		::CoTaskMemFree(tmp);
+		tmp = nullptr;
+		mpt::rethrow_out_of_memory(e);
+	}
+	::CoTaskMemFree(tmp);
+	tmp = nullptr;
+	return mpt::convert<mpt::winstring>(str);
+}
+
+inline CLSID StringToCLSID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	CLSID clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			// nothing
+			break;
+		case E_INVALIDARG:
+			clsid = CLSID();
+			break;
+		case CO_E_CLASSSTRING:
+			clsid = CLSID();
+			break;
+		case REGDB_E_CLASSNOTREG:
+			clsid = CLSID();
+			break;
+		case REGDB_E_READREGDB:
+			clsid = CLSID();
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			clsid = CLSID();
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return clsid;
+}
+
+inline bool VerifyStringToCLSID(const mpt::winstring & str_, CLSID & clsid) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	bool result = false;
+	clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			result = true;
+			break;
+		case E_INVALIDARG:
+			result = false;
+			break;
+		case CO_E_CLASSSTRING:
+			result = false;
+			break;
+		case REGDB_E_CLASSNOTREG:
+			result = false;
+			break;
+		case REGDB_E_READREGDB:
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return result;
+}
+
+inline bool IsCLSID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	bool result = false;
+	CLSID clsid = CLSID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::CLSIDFromString(tmp.data(), &clsid)) {
+		case NOERROR:
+			result = true;
+			break;
+		case E_INVALIDARG:
+			result = false;
+			break;
+		case CO_E_CLASSSTRING:
+			result = false;
+			break;
+		case REGDB_E_CLASSNOTREG:
+			result = false;
+			break;
+		case REGDB_E_READREGDB:
+			result = false;
+			throw std::runtime_error("CLSIDFromString() failed: REGDB_E_READREGDB.");
+			break;
+		default:
+			result = false;
+			throw std::logic_error("CLSIDFromString() failed.");
+			break;
+	}
+	return result;
+}
+
+
+// COM IID<->string conversion
+
+inline IID StringToIID(const mpt::winstring & str_) {
+	const std::wstring str = mpt::convert<std::wstring>(str_);
+	IID iid = IID();
+	std::vector<OLECHAR> tmp(str.c_str(), str.c_str() + str.length() + 1);
+	switch (::IIDFromString(tmp.data(), &iid)) {
+		case S_OK:
+			// nothing
+			break;
+		case E_OUTOFMEMORY:
+			iid = IID();
+			mpt::throw_out_of_memory();
+			break;
+		case E_INVALIDARG:
+			iid = IID();
+			break;
+		default:
+			iid = IID();
+			throw std::logic_error("IIDFromString() failed.");
+			break;
+	}
+	return iid;
+}
+
+inline mpt::winstring IIDToString(IID iid) {
+	std::wstring str;
+	LPOLESTR tmp = nullptr;
+	switch (::StringFromIID(iid, &tmp)) {
+		case S_OK:
+			break;
+		case E_OUTOFMEMORY:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			mpt::throw_out_of_memory();
+			break;
+		default:
+			if (tmp) {
+				::CoTaskMemFree(tmp);
+				tmp = nullptr;
+			}
+			throw std::logic_error("StringFromIID() failed.");
+			break;
+	}
+	if (!tmp) {
+		throw std::logic_error("StringFromIID() failed.");
+	}
+	try {
+		str = tmp;
+	} catch (mpt::out_of_memory e) {
+		::CoTaskMemFree(tmp);
+		tmp = nullptr;
+		mpt::rethrow_out_of_memory(e);
+	}
+	return mpt::convert<mpt::winstring>(str);
+}
+
+
+// General GUID<->string conversion.
+// The string must/will be in standard GUID format: {4F9A455D-E7EF-4367-B2F0-0C83A38A5C72}
+
+inline GUID StringToGUID(const mpt::winstring & str) {
+	return StringToIID(str);
+}
+
+inline mpt::winstring GUIDToString(GUID guid) {
+	std::vector<OLECHAR> tmp(256);
+	if (::StringFromGUID2(guid, tmp.data(), static_cast<int>(tmp.size())) <= 0) {
+		throw std::logic_error("StringFromGUID2() failed.");
+	}
+	return mpt::convert<mpt::winstring>(tmp.data());
+}
+
+
+// Create a COM GUID
+
+inline GUID CreateGUID() {
+	GUID guid = GUID();
+	switch (::CoCreateGuid(&guid)) {
+		case S_OK:
+			// nothing
+			break;
+		default:
+			guid = GUID();
+			throw std::runtime_error("CoCreateGuid() failed.");
+	}
+	return guid;
+}
+
+
+// Checks the UUID against the NULL UUID. Returns false if it is NULL, true otherwise.
+
+inline bool IsValid(::UUID uuid) {
+	return false
+		|| uuid.Data1 != 0
+		|| uuid.Data2 != 0
+		|| uuid.Data3 != 0
+		|| uuid.Data4[0] != 0
+		|| uuid.Data4[1] != 0
+		|| uuid.Data4[2] != 0
+		|| uuid.Data4[3] != 0
+		|| uuid.Data4[4] != 0
+		|| uuid.Data4[5] != 0
+		|| uuid.Data4[6] != 0
+		|| uuid.Data4[7] != 0;
+}
+
+
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_GUID_HPP

Property changes on: src/mpt/uuid/guid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/tests/tests_uuid.hpp
===================================================================
--- src/mpt/uuid/tests/tests_uuid.hpp	(nonexistent)
+++ src/mpt/uuid/tests/tests_uuid.hpp	(working copy)
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_UUID_HPP
+#define MPT_BASE_TESTS_UUID_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+#include "mpt/uuid/guid.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <cstddef>
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_uuid{
+	"mpt/uuid",
+	[](mpt::test::context & context) {
+		using namespace mpt::uuid_literals;
+
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull).ToUString(), MPT_USTRING("2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"));
+#if MPT_OS_WINDOWS
+		constexpr mpt::UUID uuid_tmp = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid_tmp);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(mpt::StringToGUID(TEXT("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(mpt::StringToCLSID(TEXT("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull), mpt::UUID(mpt::StringToGUID(TEXT("{00112233-4455-6677-8899-AABBCCDDEEFF}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull), mpt::UUID(mpt::StringToGUID(TEXT("{00112233-4455-6677-C899-AABBCCDDEEFF}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull)), TEXT("{00112233-4455-6677-8899-AABBCCDDEEFF}"));
+		MPT_TEST_EXPECT_EQUAL(mpt::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull)), TEXT("{00112233-4455-6677-C899-AABBCCDDEEFF}"));
+#endif // MPT_OS_WINDOWS
+
+		mpt::sane_random_device rd;
+		mpt::good_engine prng = mpt::make_prng<mpt::good_engine>(rd);
+
+#if MPT_OS_WINDOWS
+		MPT_TEST_EXPECT_EQUAL(mpt::IsValid(mpt::CreateGUID()), true);
+		{
+			mpt::UUID uuid = mpt::UUID::Generate(prng);
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID::FromString(mpt::UUID(uuid).ToUString()));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToGUID(mpt::GUIDToString(uuid))));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToIID(mpt::IIDToString(uuid))));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToCLSID(mpt::CLSIDToString(uuid))));
+		}
+		{
+			GUID guid = mpt::UUID::Generate(prng);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, static_cast<GUID>(mpt::UUID::FromString(mpt::UUID(guid).ToUString()))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToGUID(mpt::GUIDToString(guid))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToIID(mpt::IIDToString(guid))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToCLSID(mpt::CLSIDToString(guid))), TRUE);
+		}
+#endif // MPT_OS_WINDOWS
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::Generate(prng).IsValid(), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::GenerateLocalUseOnly(prng).IsValid(), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::Generate(prng) != mpt::UUID::Generate(prng), true);
+		mpt::UUID a = mpt::UUID::Generate(prng);
+		MPT_TEST_EXPECT_EQUAL(a, mpt::UUID::FromString(a.ToUString()));
+		std::byte uuiddata[16]{};
+		for (std::size_t i = 0; i < 16; ++i) {
+			uuiddata[i] = mpt::byte_cast<std::byte>(static_cast<uint8>(i));
+		}
+		static_assert(sizeof(mpt::UUID) == 16);
+		mpt::UUIDbin uuid2;
+		std::memcpy(&uuid2, uuiddata, 16);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(uuid2).ToUString(), MPT_USTRING("00010203-0405-0607-0809-0a0b0c0d0e0f"));
+
+		constexpr mpt::UUID uuid3 = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid3);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_UUID_HPP

Property changes on: src/mpt/uuid/tests/tests_uuid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/tests/tests_uuid.hpp
===================================================================
--- src/mpt/uuid/tests/tests_uuid.hpp	(nonexistent)
+++ src/mpt/uuid/tests/tests_uuid.hpp	(working copy)
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_UUID_HPP
+#define MPT_BASE_TESTS_UUID_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/random/default_engines.hpp"
+#include "mpt/random/device.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+#include "mpt/uuid/guid.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <cstddef>
+#include <cstring>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_uuid{
+	"mpt/uuid",
+	[](mpt::test::context & context) {
+		using namespace mpt::uuid_literals;
+
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull).ToUString(), MPT_USTRING("2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"));
+#if MPT_OS_WINDOWS
+		constexpr mpt::UUID uuid_tmp = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid_tmp);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(mpt::StringToGUID(TEXT("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(mpt::StringToCLSID(TEXT("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull), mpt::UUID(mpt::StringToGUID(TEXT("{00112233-4455-6677-8899-AABBCCDDEEFF}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull), mpt::UUID(mpt::StringToGUID(TEXT("{00112233-4455-6677-C899-AABBCCDDEEFF}"))));
+		MPT_TEST_EXPECT_EQUAL(mpt::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull)), TEXT("{00112233-4455-6677-8899-AABBCCDDEEFF}"));
+		MPT_TEST_EXPECT_EQUAL(mpt::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull)), TEXT("{00112233-4455-6677-C899-AABBCCDDEEFF}"));
+#endif // MPT_OS_WINDOWS
+
+		mpt::sane_random_device rd;
+		mpt::good_engine prng = mpt::make_prng<mpt::good_engine>(rd);
+
+#if MPT_OS_WINDOWS
+		MPT_TEST_EXPECT_EQUAL(mpt::IsValid(mpt::CreateGUID()), true);
+		{
+			mpt::UUID uuid = mpt::UUID::Generate(prng);
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID::FromString(mpt::UUID(uuid).ToUString()));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToGUID(mpt::GUIDToString(uuid))));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToIID(mpt::IIDToString(uuid))));
+			MPT_TEST_EXPECT_EQUAL(uuid, mpt::UUID(mpt::StringToCLSID(mpt::CLSIDToString(uuid))));
+		}
+		{
+			GUID guid = mpt::UUID::Generate(prng);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, static_cast<GUID>(mpt::UUID::FromString(mpt::UUID(guid).ToUString()))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToGUID(mpt::GUIDToString(guid))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToIID(mpt::IIDToString(guid))), TRUE);
+			MPT_TEST_EXPECT_EQUAL(IsEqualGUID(guid, mpt::StringToCLSID(mpt::CLSIDToString(guid))), TRUE);
+		}
+#endif // MPT_OS_WINDOWS
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::Generate(prng).IsValid(), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::GenerateLocalUseOnly(prng).IsValid(), true);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID::Generate(prng) != mpt::UUID::Generate(prng), true);
+		mpt::UUID a = mpt::UUID::Generate(prng);
+		MPT_TEST_EXPECT_EQUAL(a, mpt::UUID::FromString(a.ToUString()));
+		std::byte uuiddata[16]{};
+		for (std::size_t i = 0; i < 16; ++i) {
+			uuiddata[i] = mpt::byte_cast<std::byte>(static_cast<uint8>(i));
+		}
+		static_assert(sizeof(mpt::UUID) == 16);
+		mpt::UUIDbin uuid2;
+		std::memcpy(&uuid2, uuiddata, 16);
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(uuid2).ToUString(), MPT_USTRING("00010203-0405-0607-0809-0a0b0c0d0e0f"));
+
+		constexpr mpt::UUID uuid3 = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
+		MPT_TEST_EXPECT_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid3);
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_UUID_HPP

Property changes on: src/mpt/uuid/tests/tests_uuid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid/uuid.hpp
===================================================================
--- src/mpt/uuid/uuid.hpp	(nonexistent)
+++ src/mpt/uuid/uuid.hpp	(working copy)
@@ -0,0 +1,386 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_UUID_HPP
+#define MPT_UUID_UUID_HPP
+
+
+
+#include "mpt/base/constexpr_throw.hpp"
+#include "mpt/base/macros.hpp"
+#include "mpt/base/integer.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/endian/integer.hpp"
+#include "mpt/random/random.hpp"
+#include "mpt/string/format_simple.hpp"
+#include "mpt/string/parse.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/string/utility.hpp"
+
+#if MPT_OS_WINDOWS
+#include <guiddef.h>
+#include <objbase.h>
+#endif // MPT_OS_WINDOWS
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+// Microsoft on-disk layout
+struct GUIDms {
+	uint32le Data1;
+	uint16le Data2;
+	uint16le Data3;
+	uint64be Data4; // yes, big endian here
+};
+constexpr bool declare_binary_safe(const GUIDms &) {
+	return true;
+}
+static_assert(mpt::check_binary_size<GUIDms>(16));
+
+// RFC binary format
+struct UUIDbin {
+	uint32be Data1;
+	uint16be Data2;
+	uint16be Data3;
+	uint64be Data4;
+};
+constexpr bool declare_binary_safe(const UUIDbin &) {
+	return true;
+}
+static_assert(mpt::check_binary_size<UUIDbin>(16));
+
+
+
+struct UUID {
+private:
+	uint32 Data1;
+	uint16 Data2;
+	uint16 Data3;
+	uint64 Data4;
+
+public:
+	MPT_CONSTEXPRINLINE uint32 GetData1() const noexcept {
+		return Data1;
+	}
+	MPT_CONSTEXPRINLINE uint16 GetData2() const noexcept {
+		return Data2;
+	}
+	MPT_CONSTEXPRINLINE uint16 GetData3() const noexcept {
+		return Data3;
+	}
+	MPT_CONSTEXPRINLINE uint64 GetData4() const noexcept {
+		return Data4;
+	}
+
+public:
+	MPT_CONSTEXPRINLINE uint64 GetData64_1() const noexcept {
+		return (static_cast<uint64>(Data1) << 32) | (static_cast<uint64>(Data2) << 16) | (static_cast<uint64>(Data3) << 0);
+	}
+	MPT_CONSTEXPRINLINE uint64 GetData64_2() const noexcept {
+		return Data4;
+	}
+
+public:
+	// xxxxxxxx-xxxx-Mmxx-Nnxx-xxxxxxxxxxxx
+	// <--32-->-<16>-<16>-<-------64------>
+	MPT_CONSTEXPRINLINE bool IsNil() const noexcept {
+		return (Data1 == 0) && (Data2 == 0) && (Data3 == 0) && (Data4 == 0);
+	}
+	MPT_CONSTEXPRINLINE bool IsValid() const noexcept {
+		return (Data1 != 0) || (Data2 != 0) || (Data3 != 0) || (Data4 != 0);
+	}
+	MPT_CONSTEXPRINLINE uint8 Variant() const noexcept {
+		return Nn() >> 4u;
+	}
+	MPT_CONSTEXPRINLINE uint8 Version() const noexcept {
+		return Mm() >> 4u;
+	}
+	MPT_CONSTEXPRINLINE bool IsRFC4122() const noexcept {
+		return (Variant() & 0xcu) == 0x8u;
+	}
+
+private:
+	MPT_CONSTEXPRINLINE uint8 Mm() const noexcept {
+		return static_cast<uint8>((Data3 >> 8) & 0xffu);
+	}
+	MPT_CONSTEXPRINLINE uint8 Nn() const noexcept {
+		return static_cast<uint8>((Data4 >> 56) & 0xffu);
+	}
+	void MakeRFC4122(uint8 version) noexcept {
+		// variant
+		uint8 Nn = static_cast<uint8>((Data4 >> 56) & 0xffu);
+		Data4 &= 0x00ffffffffffffffull;
+		Nn &= ~(0xc0u);
+		Nn |= 0x80u;
+		Data4 |= static_cast<uint64>(Nn) << 56;
+		// version
+		version &= 0x0fu;
+		uint8 Mm = static_cast<uint8>((Data3 >> 8) & 0xffu);
+		Data3 &= 0x00ffu;
+		Mm &= ~(0xf0u);
+		Mm |= (version << 4u);
+		Data3 |= static_cast<uint16>(Mm) << 8;
+	}
+#if MPT_OS_WINDOWS
+private:
+	static mpt::UUID UUIDFromWin32(::UUID uuid) {
+		return mpt::UUID(uuid.Data1, uuid.Data2, uuid.Data3, (static_cast<uint64>(0) | (static_cast<uint64>(uuid.Data4[0]) << 56) | (static_cast<uint64>(uuid.Data4[1]) << 48) | (static_cast<uint64>(uuid.Data4[2]) << 40) | (static_cast<uint64>(uuid.Data4[3]) << 32) | (static_cast<uint64>(uuid.Data4[4]) << 24) | (static_cast<uint64>(uuid.Data4[5]) << 16) | (static_cast<uint64>(uuid.Data4[6]) << 8) | (static_cast<uint64>(uuid.Data4[7]) << 0)));
+	}
+	static ::UUID UUIDToWin32(mpt::UUID uuid) {
+		::UUID result = ::UUID();
+		result.Data1 = uuid.GetData1();
+		result.Data2 = uuid.GetData2();
+		result.Data3 = uuid.GetData3();
+		result.Data4[0] = static_cast<uint8>(uuid.GetData4() >> 56);
+		result.Data4[1] = static_cast<uint8>(uuid.GetData4() >> 48);
+		result.Data4[2] = static_cast<uint8>(uuid.GetData4() >> 40);
+		result.Data4[3] = static_cast<uint8>(uuid.GetData4() >> 32);
+		result.Data4[4] = static_cast<uint8>(uuid.GetData4() >> 24);
+		result.Data4[5] = static_cast<uint8>(uuid.GetData4() >> 16);
+		result.Data4[6] = static_cast<uint8>(uuid.GetData4() >> 8);
+		result.Data4[7] = static_cast<uint8>(uuid.GetData4() >> 0);
+		return result;
+	}
+
+public:
+	explicit UUID(::UUID uuid) {
+		*this = UUIDFromWin32(uuid);
+	}
+	operator ::UUID() const {
+		return UUIDToWin32(*this);
+	}
+#endif // MPT_OS_WINDOWS
+private:
+	static MPT_CONSTEXPRINLINE uint8 NibbleFromChar(char x) {
+		return ('0' <= x && x <= '9') ? static_cast<uint8>(x - '0' + 0) : ('a' <= x && x <= 'z') ? static_cast<uint8>(x - 'a' + 10)
+			: ('A' <= x && x <= 'Z')                                                             ? static_cast<uint8>(x - 'A' + 10)
+																								 : mpt::constexpr_throw<uint8>(std::domain_error(""));
+	}
+	static MPT_CONSTEXPRINLINE uint8 ByteFromHex(char x, char y) {
+		return static_cast<uint8>(uint8(0) | (NibbleFromChar(x) << 4) | (NibbleFromChar(y) << 0));
+	}
+	static MPT_CONSTEXPRINLINE uint16 ParseHex16(const char * str) {
+		return static_cast<uint16>(uint16(0) | (static_cast<uint16>(ByteFromHex(str[0], str[1])) << 8) | (static_cast<uint16>(ByteFromHex(str[2], str[3])) << 0));
+	}
+	static MPT_CONSTEXPRINLINE uint32 ParseHex32(const char * str) {
+		return static_cast<uint32>(uint32(0) | (static_cast<uint32>(ByteFromHex(str[0], str[1])) << 24) | (static_cast<uint32>(ByteFromHex(str[2], str[3])) << 16) | (static_cast<uint32>(ByteFromHex(str[4], str[5])) << 8) | (static_cast<uint32>(ByteFromHex(str[6], str[7])) << 0));
+	}
+
+public:
+	static MPT_CONSTEXPRINLINE UUID ParseLiteral(const char * str, std::size_t len) {
+		return (len == 36 && str[8] == '-' && str[13] == '-' && str[18] == '-' && str[23] == '-') ? mpt::UUID(
+				   ParseHex32(str + 0),
+				   ParseHex16(str + 9),
+				   ParseHex16(str + 14),
+				   uint64(0)
+					   | (static_cast<uint64>(ParseHex16(str + 19)) << 48)
+					   | (static_cast<uint64>(ParseHex16(str + 24)) << 32)
+					   | (static_cast<uint64>(ParseHex32(str + 28)) << 0))
+																								  : mpt::constexpr_throw<mpt::UUID>(std::domain_error(""));
+	}
+
+public:
+	MPT_CONSTEXPRINLINE UUID() noexcept
+		: Data1(0)
+		, Data2(0)
+		, Data3(0)
+		, Data4(0) {
+		return;
+	}
+	MPT_CONSTEXPRINLINE explicit UUID(uint32 Data1, uint16 Data2, uint16 Data3, uint64 Data4) noexcept
+		: Data1(Data1)
+		, Data2(Data2)
+		, Data3(Data3)
+		, Data4(Data4) {
+		return;
+	}
+	explicit UUID(UUIDbin uuid) {
+		Data1 = uuid.Data1.get();
+		Data2 = uuid.Data2.get();
+		Data3 = uuid.Data3.get();
+		Data4 = uuid.Data4.get();
+	}
+	explicit UUID(GUIDms guid) {
+		Data1 = guid.Data1.get();
+		Data2 = guid.Data2.get();
+		Data3 = guid.Data3.get();
+		Data4 = guid.Data4.get();
+	}
+	operator UUIDbin() const {
+		UUIDbin result{};
+		result.Data1 = GetData1();
+		result.Data2 = GetData2();
+		result.Data3 = GetData3();
+		result.Data4 = GetData4();
+		return result;
+	}
+	operator GUIDms() const {
+		GUIDms result{};
+		result.Data1 = GetData1();
+		result.Data2 = GetData2();
+		result.Data3 = GetData3();
+		result.Data4 = GetData4();
+		return result;
+	}
+
+public:
+	// Create a UUID
+	template <typename Trng>
+	static UUID Generate(Trng & rng) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+#if (_WIN32_WINNT >= 0x0602)
+		::GUID guid = ::GUID();
+		HRESULT result = CoCreateGuid(&guid);
+		if (result != S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(guid);
+#else
+		return mpt::UUID::RFC4122Random(rng);
+#endif
+#elif MPT_OS_WINDOWS && !MPT_OS_WINDOWS_WINRT
+		::UUID uuid = ::UUID();
+		RPC_STATUS status = ::UuidCreate(&uuid);
+		if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		status = RPC_S_OK;
+		if (UuidIsNil(&uuid, &status) != FALSE) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		if (status != RPC_S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(uuid);
+#else
+		return RFC4122Random(rng);
+#endif
+	}
+	// Create a UUID that contains local, traceable information.
+	// Safe for local use. May be faster.
+	template <typename Trng>
+	static UUID GenerateLocalUseOnly(Trng & rng) {
+#if MPT_OS_WINDOWS && MPT_OS_WINDOWS_WINRT
+#if (_WIN32_WINNT >= 0x0602)
+		::GUID guid = ::GUID();
+		HRESULT result = CoCreateGuid(&guid);
+		if (result != S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(guid);
+#else
+		return mpt::UUID::RFC4122Random(rng);
+#endif
+#elif MPT_OS_WINDOWS && !MPT_OS_WINDOWS_WINRT
+#if _WIN32_WINNT >= 0x0501
+		// Available since Win2000, but we check for WinXP in order to not use this
+		// function in Win32old builds. It is not available on some non-fully
+		// patched Win98SE installs in the wild.
+		::UUID uuid = ::UUID();
+		RPC_STATUS status = ::UuidCreateSequential(&uuid);
+		if (status != RPC_S_OK && status != RPC_S_UUID_LOCAL_ONLY) {
+			return Generate(rng);
+		}
+		status = RPC_S_OK;
+		if (UuidIsNil(&uuid, &status) != FALSE) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		if (status != RPC_S_OK) {
+			return mpt::UUID::RFC4122Random(rng);
+		}
+		return mpt::UUID::UUIDFromWin32(uuid);
+#else
+		// Fallback to ::UuidCreate is safe as ::UuidCreateSequential is only a
+		// tiny performance optimization.
+		return Generate(rng);
+#endif
+#else
+		return RFC4122Random(rng);
+#endif
+	}
+	// Create a RFC4122 Random UUID.
+	template <typename Trng>
+	static UUID RFC4122Random(Trng & prng) {
+		UUID result;
+		result.Data1 = mpt::random<uint32>(prng);
+		result.Data2 = mpt::random<uint16>(prng);
+		result.Data3 = mpt::random<uint16>(prng);
+		result.Data4 = mpt::random<uint64>(prng);
+		result.MakeRFC4122(4);
+		return result;
+	}
+	friend UUID UUIDRFC4122NamespaceV3(const UUID & ns, const mpt::ustring & name);
+	friend UUID UUIDRFC4122NamespaceV5(const UUID & ns, const mpt::ustring & name);
+
+public:
+	// General UUID<->string conversion.
+	// The string must/will be in standard UUID format: 4f9a455d-e7ef-4367-b2f0-0c83a38a5c72
+	static UUID FromString(const mpt::ustring & str) {
+		std::vector<mpt::ustring> segments = mpt::split<mpt::ustring>(str, MPT_ULITERAL("-"));
+		if (segments.size() != 5) {
+			return UUID();
+		}
+		if (segments[0].length() != 8) {
+			return UUID();
+		}
+		if (segments[1].length() != 4) {
+			return UUID();
+		}
+		if (segments[2].length() != 4) {
+			return UUID();
+		}
+		if (segments[3].length() != 4) {
+			return UUID();
+		}
+		if (segments[4].length() != 12) {
+			return UUID();
+		}
+		UUID result;
+		result.Data1 = mpt::ConvertHexStringTo<uint32>(segments[0]);
+		result.Data2 = mpt::ConvertHexStringTo<uint16>(segments[1]);
+		result.Data3 = mpt::ConvertHexStringTo<uint16>(segments[2]);
+		result.Data4 = mpt::ConvertHexStringTo<uint64>(segments[3] + segments[4]);
+		return result;
+	}
+	mpt::ustring ToUString() const {
+		return mpt::ustring()
+			+ mpt::format<mpt::ustring>::hex0<8>(GetData1())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(GetData2())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(GetData3())
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 48))
+			+ MPT_USTRING("-")
+			+ mpt::format<mpt::ustring>::hex0<4>(static_cast<uint16>(GetData4() >> 32))
+			+ mpt::format<mpt::ustring>::hex0<8>(static_cast<uint32>(GetData4() >> 0));
+	}
+};
+
+MPT_CONSTEXPRINLINE bool operator==(const mpt::UUID & a, const mpt::UUID & b) noexcept {
+	return (a.GetData1() == b.GetData1()) && (a.GetData2() == b.GetData2()) && (a.GetData3() == b.GetData3()) && (a.GetData4() == b.GetData4());
+}
+
+MPT_CONSTEXPRINLINE bool operator!=(const mpt::UUID & a, const mpt::UUID & b) noexcept {
+	return (a.GetData1() != b.GetData1()) || (a.GetData2() != b.GetData2()) || (a.GetData3() != b.GetData3()) || (a.GetData4() != b.GetData4());
+}
+
+
+namespace uuid_literals {
+
+MPT_CONSTEXPRINLINE mpt::UUID operator"" _uuid(const char * str, std::size_t len) {
+	return mpt::UUID::ParseLiteral(str, len);
+}
+
+} // namespace uuid_literals
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_UUID_HPP

Property changes on: src/mpt/uuid/uuid.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
===================================================================
--- src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp	(nonexistent)
+++ src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp	(working copy)
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_UUID_NAMESPACE_HPP
+#define MPT_BASE_TESTS_UUID_NAMESPACE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+#include "mpt/uuid/uuid.hpp"
+#include "mpt/uuid_namespace/uuid_namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_uuid_namespace{
+	"mpt/uuid_namespace",
+	[](mpt::test::context & context) {
+		{
+			constexpr mpt::UUID uuid_ns_dns = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"_uuid;
+			constexpr mpt::UUID expected = "74738ff5-5367-5958-9aee-98fffdcd1876"_uuid;
+			mpt::UUID gotten = mpt::UUIDRFC4122NamespaceV5(uuid_ns_dns, MPT_USTRING("www.example.org"));
+			MPT_TEST_EXPECT_EQUAL(gotten, expected);
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_UUID_NAMESPACE_HPP

Property changes on: src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid_namespace/uuid_namespace.hpp
===================================================================
--- src/mpt/uuid_namespace/uuid_namespace.hpp	(nonexistent)
+++ src/mpt/uuid_namespace/uuid_namespace.hpp	(working copy)
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP
+#define MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <algorithm>
+#include <array>
+#include <string>
+#include <vector>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+// Create a RFC4122 Version 3 namespace UUID
+inline mpt::UUID UUIDRFC4122NamespaceV3(const mpt::UUID & ns, const mpt::ustring & name) {
+	mpt::UUIDbin binns = ns;
+	std::vector<std::byte> buf;
+	buf.resize(sizeof(mpt::UUIDbin));
+	std::copy(mpt::as_raw_memory(binns).data(), mpt::as_raw_memory(binns).data() + sizeof(mpt::UUIDbin), buf.data());
+	std::string utf8name = mpt::convert<std::string>(mpt::common_encoding::utf8, name);
+	buf.resize(buf.size() + utf8name.length());
+	std::transform(utf8name.begin(), utf8name.end(), buf.data() + sizeof(mpt::UUIDbin), [](char c) { return mpt::byte_cast<std::byte>(c); });
+	std::array<std::byte, 16> hash = mpt::crypto::hash::MD5().process(mpt::as_span(buf)).result();
+	mpt::UUIDbin uuidbin;
+	std::copy(hash.begin(), hash.begin() + 16, mpt::as_raw_memory(uuidbin).data());
+	mpt::UUID uuid{uuidbin};
+	uuid.MakeRFC4122(3);
+	return uuid;
+}
+
+// Create a RFC4122 Version 5 namespace UUID
+inline mpt::UUID UUIDRFC4122NamespaceV5(const mpt::UUID & ns, const mpt::ustring & name) {
+	mpt::UUIDbin binns = ns;
+	std::vector<std::byte> buf;
+	buf.resize(sizeof(mpt::UUIDbin));
+	std::copy(mpt::as_raw_memory(binns).data(), mpt::as_raw_memory(binns).data() + sizeof(mpt::UUIDbin), buf.data());
+	std::string utf8name = mpt::convert<std::string>(mpt::common_encoding::utf8, name);
+	buf.resize(buf.size() + utf8name.length());
+	std::transform(utf8name.begin(), utf8name.end(), buf.data() + sizeof(mpt::UUIDbin), [](char c) { return mpt::byte_cast<std::byte>(c); });
+	std::array<std::byte, 20> hash = mpt::crypto::hash::SHA1().process(mpt::as_span(buf)).result();
+	UUIDbin uuidbin;
+	std::copy(hash.begin(), hash.begin() + 16, mpt::as_raw_memory(uuidbin).data());
+	mpt::UUID uuid{uuidbin};
+	uuid.MakeRFC4122(5);
+	return uuid;
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP

Property changes on: src/mpt/uuid_namespace/uuid_namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
===================================================================
--- src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp	(nonexistent)
+++ src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp	(working copy)
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_UUID_NAMESPACE_HPP
+#define MPT_BASE_TESTS_UUID_NAMESPACE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+#include "mpt/uuid/uuid.hpp"
+#include "mpt/uuid_namespace/uuid_namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_uuid_namespace{
+	"mpt/uuid_namespace",
+	[](mpt::test::context & context) {
+		{
+			constexpr mpt::UUID uuid_ns_dns = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"_uuid;
+			constexpr mpt::UUID expected = "74738ff5-5367-5958-9aee-98fffdcd1876"_uuid;
+			mpt::UUID gotten = mpt::UUIDRFC4122NamespaceV5(uuid_ns_dns, MPT_USTRING("www.example.org"));
+			MPT_TEST_EXPECT_EQUAL(gotten, expected);
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_UUID_NAMESPACE_HPP

Property changes on: src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
===================================================================
--- src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp	(nonexistent)
+++ src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp	(working copy)
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_BASE_TESTS_UUID_NAMESPACE_HPP
+#define MPT_BASE_TESTS_UUID_NAMESPACE_HPP
+
+
+
+#include "mpt/base/namespace.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+#include "mpt/uuid/uuid.hpp"
+#include "mpt/uuid_namespace/uuid_namespace.hpp"
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+inline mpt::test::group tests_uuid_namespace{
+	"mpt/uuid_namespace",
+	[](mpt::test::context & context) {
+		{
+			constexpr mpt::UUID uuid_ns_dns = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"_uuid;
+			constexpr mpt::UUID expected = "74738ff5-5367-5958-9aee-98fffdcd1876"_uuid;
+			mpt::UUID gotten = mpt::UUIDRFC4122NamespaceV5(uuid_ns_dns, MPT_USTRING("www.example.org"));
+			MPT_TEST_EXPECT_EQUAL(gotten, expected);
+		}
+	}};
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_BASE_TESTS_UUID_NAMESPACE_HPP

Property changes on: src/mpt/uuid_namespace/tests/tests_uuid_namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: src/mpt/uuid_namespace/uuid_namespace.hpp
===================================================================
--- src/mpt/uuid_namespace/uuid_namespace.hpp	(nonexistent)
+++ src/mpt/uuid_namespace/uuid_namespace.hpp	(working copy)
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */
+
+#ifndef MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP
+#define MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP
+
+
+
+#include "mpt/base/detect.hpp"
+#include "mpt/base/memory.hpp"
+#include "mpt/base/namespace.hpp"
+#include "mpt/crypto/hash.hpp"
+#include "mpt/string/convert.hpp"
+#include "mpt/string/types.hpp"
+#include "mpt/uuid/uuid.hpp"
+
+#include <algorithm>
+#include <array>
+#include <string>
+#include <vector>
+
+
+
+namespace mpt {
+inline namespace MPT_INLINE_NS {
+
+
+
+#if MPT_OS_WINDOWS
+
+// Create a RFC4122 Version 3 namespace UUID
+inline mpt::UUID UUIDRFC4122NamespaceV3(const mpt::UUID & ns, const mpt::ustring & name) {
+	mpt::UUIDbin binns = ns;
+	std::vector<std::byte> buf;
+	buf.resize(sizeof(mpt::UUIDbin));
+	std::copy(mpt::as_raw_memory(binns).data(), mpt::as_raw_memory(binns).data() + sizeof(mpt::UUIDbin), buf.data());
+	std::string utf8name = mpt::convert<std::string>(mpt::common_encoding::utf8, name);
+	buf.resize(buf.size() + utf8name.length());
+	std::transform(utf8name.begin(), utf8name.end(), buf.data() + sizeof(mpt::UUIDbin), [](char c) { return mpt::byte_cast<std::byte>(c); });
+	std::array<std::byte, 16> hash = mpt::crypto::hash::MD5().process(mpt::as_span(buf)).result();
+	mpt::UUIDbin uuidbin;
+	std::copy(hash.begin(), hash.begin() + 16, mpt::as_raw_memory(uuidbin).data());
+	mpt::UUID uuid{uuidbin};
+	uuid.MakeRFC4122(3);
+	return uuid;
+}
+
+// Create a RFC4122 Version 5 namespace UUID
+inline mpt::UUID UUIDRFC4122NamespaceV5(const mpt::UUID & ns, const mpt::ustring & name) {
+	mpt::UUIDbin binns = ns;
+	std::vector<std::byte> buf;
+	buf.resize(sizeof(mpt::UUIDbin));
+	std::copy(mpt::as_raw_memory(binns).data(), mpt::as_raw_memory(binns).data() + sizeof(mpt::UUIDbin), buf.data());
+	std::string utf8name = mpt::convert<std::string>(mpt::common_encoding::utf8, name);
+	buf.resize(buf.size() + utf8name.length());
+	std::transform(utf8name.begin(), utf8name.end(), buf.data() + sizeof(mpt::UUIDbin), [](char c) { return mpt::byte_cast<std::byte>(c); });
+	std::array<std::byte, 20> hash = mpt::crypto::hash::SHA1().process(mpt::as_span(buf)).result();
+	UUIDbin uuidbin;
+	std::copy(hash.begin(), hash.begin() + 16, mpt::as_raw_memory(uuidbin).data());
+	mpt::UUID uuid{uuidbin};
+	uuid.MakeRFC4122(5);
+	return uuid;
+}
+
+#endif // MPT_OS_WINDOWS
+
+
+
+} // namespace MPT_INLINE_NS
+} // namespace mpt
+
+
+
+#endif // MPT_UUID_NAMESPACE_UUID_NAMESPACE_HPP

Property changes on: src/mpt/uuid_namespace/uuid_namespace.hpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++hdr
\ No newline at end of property
Index: test/mpt_tests_base.cpp
===================================================================
--- test/mpt_tests_base.cpp	(nonexistent)
+++ test/mpt_tests_base.cpp	(working copy)
@@ -0,0 +1,13 @@
+
+#include "stdafx.h"
+
+#ifdef ENABLE_TESTS
+
+#include "mpt/base/tests/tests_base_arithmetic_shift.hpp"
+#include "mpt/base/tests/tests_base_bit.hpp"
+#include "mpt/base/tests/tests_base_math.hpp"
+#include "mpt/base/tests/tests_base_saturate_cast.hpp"
+#include "mpt/base/tests/tests_base_saturate_round.hpp"
+#include "mpt/base/tests/tests_base_wrapping_divide.hpp"
+
+#endif

Property changes on: test/mpt_tests_base.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++src
\ No newline at end of property
Index: test/mpt_tests_binary.cpp
===================================================================
--- test/mpt_tests_binary.cpp	(nonexistent)
+++ test/mpt_tests_binary.cpp	(working copy)
@@ -0,0 +1,8 @@
+
+#include "stdafx.h"
+
+#ifdef ENABLE_TESTS
+
+#include "mpt/binary/tests/tests_binary.hpp"
+
+#endif

Property changes on: test/mpt_tests_binary.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++src
\ No newline at end of property
Index: test/mpt_tests_crc.cpp
===================================================================
--- test/mpt_tests_crc.cpp	(nonexistent)
+++ test/mpt_tests_crc.cpp	(working copy)
@@ -0,0 +1,8 @@
+
+#include "stdafx.h"
+
+#ifdef ENABLE_TESTS
+
+#include "mpt/crc/tests/tests_crc.hpp"
+
+#endif

Property changes on: test/mpt_tests_crc.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++src
\ No newline at end of property
Index: test/mpt_tests_crypto.cpp
===================================================================
--- test/mpt_tests_crypto.cpp	(nonexistent)
+++ test/mpt_tests_crypto.cpp	(working copy)
@@ -0,0 +1,10 @@
+
+#include "stdafx.h"
+
+#ifdef ENABLE_TESTS
+
+#ifdef MODPLUG_TRACKER
+#include "mpt/crypto/tests/tests_crypto.hpp"
+#endif // MODPLUG_TRACKER
+
+#endif

Property changes on: test/mpt_tests_crypto.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++src
\ No newline at end of property
Index: test/mpt_tests_endian.cpp
===================================================================
--- test/mpt_tests_endian.cpp	(nonexistent)
+++ test/mpt_tests_endian.cpp	(working copy)
@@ -0,0 +1,9 @@
+
+#include "stdafx.h"
+
+#ifdef ENABLE_TESTS
+
+#include "mpt/endian/tests/tests_endian_floatingpoint.hpp"
+#include "mpt/endian/tests/tests_endian_integer.hpp"
+
+#endif

Property changes on: test/mpt_tests_endian.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++src
\ No newline at end of property
Index: test/mpt_tests_random.cpp
===================================================================
--- test/mpt_tests_random.cpp	(nonexistent)
+++ test/mpt_tests_random.cpp	(working copy)
@@ -0,0 +1,8 @@
+
+#include "stdafx.h"
+
+#ifdef ENABLE_TESTS
+
+#include "mpt/random/tests/tests_random.hpp"
+
+#endif

Property changes on: test/mpt_tests_random.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++src
\ No newline at end of property
Index: test/mpt_tests_string.cpp
===================================================================
--- test/mpt_tests_string.cpp	(nonexistent)
+++ test/mpt_tests_string.cpp	(working copy)
@@ -0,0 +1,13 @@
+
+#include "stdafx.h"
+
+#ifdef ENABLE_TESTS
+
+#include "mpt/string/tests/tests_string_buffer.hpp"
+#include "mpt/string/tests/tests_string_convert.hpp"
+#include "mpt/string/tests/tests_string_format_message.hpp"
+#include "mpt/string/tests/tests_string_format_simple.hpp"
+#include "mpt/string/tests/tests_string_parse.hpp"
+#include "mpt/string/tests/tests_string_utility.hpp"
+
+#endif

Property changes on: test/mpt_tests_string.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++src
\ No newline at end of property
Index: test/mpt_tests_uuid.cpp
===================================================================
--- test/mpt_tests_uuid.cpp	(nonexistent)
+++ test/mpt_tests_uuid.cpp	(working copy)
@@ -0,0 +1,8 @@
+
+#include "stdafx.h"
+
+#ifdef ENABLE_TESTS
+
+#include "mpt/uuid/tests/tests_uuid.hpp"
+
+#endif

Property changes on: test/mpt_tests_uuid.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++src
\ No newline at end of property
Index: test/mpt_tests_uuid_namespace.cpp
===================================================================
--- test/mpt_tests_uuid_namespace.cpp	(nonexistent)
+++ test/mpt_tests_uuid_namespace.cpp	(working copy)
@@ -0,0 +1,10 @@
+
+#include "stdafx.h"
+
+#ifdef ENABLE_TESTS
+
+#ifdef MODPLUG_TRACKER
+#include "mpt/uuid_namespace/tests/tests_uuid_namespace.hpp"
+#endif // MODPLUG_TRACKER
+
+#endif

Property changes on: test/mpt_tests_uuid_namespace.cpp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/x-c++src
\ No newline at end of property
Index: test/test.cpp
===================================================================
--- test/test.cpp	(revision 14628)
+++ test/test.cpp	(working copy)
@@ -14,7 +14,11 @@
 
 #ifdef ENABLE_TESTS
 
+#include "mpt/environment/environment.hpp"
 
+#include "mpt/test/test.hpp"
+#include "mpt/test/test_macros.hpp"
+
 #include "../common/version.h"
 #include "../common/misc_util.h"
 #include "../common/mptCRC.h"
@@ -106,13 +110,11 @@
 static MPT_NOINLINE void TestRandom();
 static MPT_NOINLINE void TestCharsets();
 static MPT_NOINLINE void TestStringFormatting();
-static MPT_NOINLINE void TestCrypto();
 static MPT_NOINLINE void TestSettings();
 static MPT_NOINLINE void TestStringIO();
 static MPT_NOINLINE void TestMIDIEvents();
 static MPT_NOINLINE void TestSampleConversion();
 static MPT_NOINLINE void TestITCompression();
-static MPT_NOINLINE void TestTunings();
 static MPT_NOINLINE void TestPCnoteSerialization();
 static MPT_NOINLINE void TestLoadSaveFile();
 static MPT_NOINLINE void TestEditing();
@@ -197,6 +199,12 @@
 
 	#endif
 
+	void (*do_mpt_test)(void) = []() {
+		mpt_test_reporter reporter{};
+		mpt::test::run_all(reporter);
+	};
+	DO_TEST(do_mpt_test);
+
 	mpt::random_device rd;
 	s_PRNG = new mpt::default_prng(mpt::make_prng<mpt::default_prng>(rd));
 
@@ -207,13 +215,11 @@
 	DO_TEST(TestRandom);
 	DO_TEST(TestCharsets);
 	DO_TEST(TestStringFormatting);
-	DO_TEST(TestCrypto);
 	DO_TEST(TestSettings);
 	DO_TEST(TestStringIO);
 	DO_TEST(TestMIDIEvents);
 	DO_TEST(TestSampleConversion);
 	DO_TEST(TestITCompression);
-	DO_TEST(TestTunings);
 
 	// slower tests, require opening a CModDoc
 	DO_TEST(TestPCnoteSerialization);
@@ -442,31 +448,6 @@
 	static_assert(int64_max == std::numeric_limits<int64>::max());
 	static_assert(uint64_max == std::numeric_limits<uint64>::max());
 
-
-	static_assert(std::numeric_limits<int8le>::min() == std::numeric_limits<int8>::min());
-	static_assert(std::numeric_limits<uint8le>::min() == std::numeric_limits<uint8>::min());
-
-	static_assert(std::numeric_limits<int16le>::min() == std::numeric_limits<int16>::min());
-	static_assert(std::numeric_limits<uint16le>::min() == std::numeric_limits<uint16>::min());
-
-	static_assert(std::numeric_limits<int32le>::min() == std::numeric_limits<int32>::min());
-	static_assert(std::numeric_limits<uint32le>::min() == std::numeric_limits<uint32>::min());
-
-	static_assert(std::numeric_limits<int64le>::min() == std::numeric_limits<int64>::min());
-	static_assert(std::numeric_limits<uint64le>::min() == std::numeric_limits<uint64>::min());
-
-	static_assert(std::numeric_limits<int8le>::max() == std::numeric_limits<int8>::max());
-	static_assert(std::numeric_limits<uint8le>::max() == std::numeric_limits<uint8>::max());
-
-	static_assert(std::numeric_limits<int16le>::max() == std::numeric_limits<int16>::max());
-	static_assert(std::numeric_limits<uint16le>::max() == std::numeric_limits<uint16>::max());
-
-	static_assert(std::numeric_limits<int32le>::max() == std::numeric_limits<int32>::max());
-	static_assert(std::numeric_limits<uint32le>::max() == std::numeric_limits<uint32>::max());
-
-	static_assert(std::numeric_limits<int64le>::max() == std::numeric_limits<int64>::max());
-	static_assert(std::numeric_limits<uint64le>::max() == std::numeric_limits<uint64>::max());
-
 }
 
 
@@ -547,39 +528,6 @@
 
 
 
-static bool BeginsWith(const std::string &str, const std::string &match)
-{
-	return (str.find(match) == 0);
-}
-static bool EndsWith(const std::string &str, const std::string &match)
-{
-	return (str.rfind(match) == (str.length() - match.length()));
-}
-
-#if MPT_WSTRING_CONVERT
-static bool BeginsWith(const std::wstring &str, const std::wstring &match)
-{
-	return (str.find(match) == 0);
-}
-static bool EndsWith(const std::wstring &str, const std::wstring &match)
-{
-	return (str.rfind(match) == (str.length() - match.length()));
-}
-#endif
-
-#if MPT_USTRING_MODE_UTF8
-static bool BeginsWith(const mpt::ustring &str, const mpt::ustring &match)
-{
-	return (str.find(match) == 0);
-}
-static bool EndsWith(const mpt::ustring &str, const mpt::ustring &match)
-{
-	return (str.rfind(match) == (str.length() - match.length()));
-}
-#endif
-
-
-
 static MPT_NOINLINE void TestStringFormatting()
 {
 	VERIFY_EQUAL(mpt::fmt::val(1.5f), "1.5");
@@ -868,117 +816,10 @@
 	return Gregorian{Y,M,D,h,m,s};
 }
 
-static MPT_CONSTEXPR20_FUN int32le TestEndianConstexpr(uint32 x)
-{
-	int32le foo{};
-	foo = x;
-	return foo;
-}
 
 static MPT_NOINLINE void TestMisc1()
 {
 
-	#if MPT_CXX_BEFORE(20)
-		VERIFY_EQUAL(mpt::get_endian(), mpt::detail::endian_probe());
-	#endif
-	MPT_MAYBE_CONSTANT_IF(mpt::endian_is_little())
-	{
-		VERIFY_EQUAL(mpt::get_endian(), mpt::endian::little);
-		MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big))
-		{
-			VERIFY_EQUAL(mpt::endian::native, mpt::endian::little);
-		}
-		#if MPT_CXX_BEFORE(20)
-			VERIFY_EQUAL(mpt::detail::endian_probe(), mpt::endian::little);
-		#endif
-	}
-	MPT_MAYBE_CONSTANT_IF(mpt::endian_is_big())
-	{
-		VERIFY_EQUAL(mpt::get_endian(), mpt::endian::big);
-		MPT_MAYBE_CONSTANT_IF((mpt::endian::native == mpt::endian::little) || (mpt::endian::native == mpt::endian::big))
-		{
-			VERIFY_EQUAL(mpt::endian::native, mpt::endian::big);
-		}
-		#if MPT_CXX_BEFORE(20)
-			VERIFY_EQUAL(mpt::detail::endian_probe(), mpt::endian::big);
-		#endif
-	}
-
-	MPT_CONSTEXPR20_VAR int32le foo = TestEndianConstexpr(23);
-	static_cast<void>(foo);
-
-	VERIFY_EQUAL(mpt::detail::SwapBytes(uint8(0x12)), 0x12);
-	VERIFY_EQUAL(mpt::detail::SwapBytes(uint16(0x1234)), 0x3412);
-	VERIFY_EQUAL(mpt::detail::SwapBytes(uint32(0x12345678u)), 0x78563412u);
-	VERIFY_EQUAL(mpt::detail::SwapBytes(uint64(0x123456789abcdef0ull)), 0xf0debc9a78563412ull);
-
-	VERIFY_EQUAL(mpt::detail::SwapBytes(int8(int8_min)), int8_min);
-	VERIFY_EQUAL(mpt::detail::SwapBytes(int16(int16_min)), int16(0x80));
-	VERIFY_EQUAL(mpt::detail::SwapBytes(int32(int32_min)), int32(0x80));
-	VERIFY_EQUAL(mpt::detail::SwapBytes(int64(int64_min)), int64(0x80));
-
-	VERIFY_EQUAL(EncodeIEEE754binary32(1.0f), 0x3f800000u);
-	VERIFY_EQUAL(EncodeIEEE754binary32(-1.0f), 0xbf800000u);
-	VERIFY_EQUAL(DecodeIEEE754binary32(0x00000000u), 0.0f);
-	VERIFY_EQUAL(DecodeIEEE754binary32(0x41840000u), 16.5f);
-	VERIFY_EQUAL(DecodeIEEE754binary32(0x3faa0000u),  1.328125f);
-	VERIFY_EQUAL(DecodeIEEE754binary32(0xbfaa0000u), -1.328125f);
-	VERIFY_EQUAL(DecodeIEEE754binary32(0x3f800000u),  1.0f);
-	VERIFY_EQUAL(DecodeIEEE754binary32(0x00000000u),  0.0f);
-	VERIFY_EQUAL(DecodeIEEE754binary32(0xbf800000u), -1.0f);
-	VERIFY_EQUAL(DecodeIEEE754binary32(0x3f800000u),  1.0f);
-	VERIFY_EQUAL(IEEE754binary32LE(1.0f).GetInt32(), 0x3f800000u);
-	VERIFY_EQUAL(IEEE754binary32BE(1.0f).GetInt32(), 0x3f800000u);
-	VERIFY_EQUAL(IEEE754binary32LE(mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x80),mpt::as_byte(0x3f)), 1.0f);
-	VERIFY_EQUAL(IEEE754binary32BE(mpt::as_byte(0x3f),mpt::as_byte(0x80),mpt::as_byte(0x00),mpt::as_byte(0x00)), 1.0f);
-	VERIFY_EQUAL(IEEE754binary32LE(1.0f), IEEE754binary32LE(mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x80),mpt::as_byte(0x3f)));
-	VERIFY_EQUAL(IEEE754binary32BE(1.0f), IEEE754binary32BE(mpt::as_byte(0x3f),mpt::as_byte(0x80),mpt::as_byte(0x00),mpt::as_byte(0x00)));
-
-	VERIFY_EQUAL(EncodeIEEE754binary64(1.0), 0x3ff0000000000000ull);
-	VERIFY_EQUAL(EncodeIEEE754binary64(-1.0), 0xbff0000000000000ull);
-	VERIFY_EQUAL(DecodeIEEE754binary64(0x0000000000000000ull), 0.0);
-	VERIFY_EQUAL(DecodeIEEE754binary64(0x4030800000000000ull), 16.5);
-	VERIFY_EQUAL(DecodeIEEE754binary64(0x3FF5400000000000ull),  1.328125);
-	VERIFY_EQUAL(DecodeIEEE754binary64(0xBFF5400000000000ull), -1.328125);
-	VERIFY_EQUAL(DecodeIEEE754binary64(0x3ff0000000000000ull),  1.0);
-	VERIFY_EQUAL(DecodeIEEE754binary64(0x0000000000000000ull),  0.0);
-	VERIFY_EQUAL(DecodeIEEE754binary64(0xbff0000000000000ull), -1.0);
-	VERIFY_EQUAL(DecodeIEEE754binary64(0x3ff0000000000000ull),  1.0);
-	VERIFY_EQUAL(IEEE754binary64LE(1.0).GetInt64(), 0x3ff0000000000000ull);
-	VERIFY_EQUAL(IEEE754binary64BE(1.0).GetInt64(), 0x3ff0000000000000ull);
-	VERIFY_EQUAL(IEEE754binary64LE(mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0xf0),mpt::as_byte(0x3f)), 1.0);
-	VERIFY_EQUAL(IEEE754binary64BE(mpt::as_byte(0x3f),mpt::as_byte(0xf0),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00)), 1.0);
-	VERIFY_EQUAL(IEEE754binary64LE(1.0), IEEE754binary64LE(mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0xf0),mpt::as_byte(0x3f)));
-	VERIFY_EQUAL(IEEE754binary64BE(1.0), IEEE754binary64BE(mpt::as_byte(0x3f),mpt::as_byte(0xf0),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00),mpt::as_byte(0x00)));
-
-	// Packed integers with defined endianness
-	{
-		int8le le8; le8.set(-128);
-		int8be be8; be8.set(-128);
-		VERIFY_EQUAL(le8, -128);
-		VERIFY_EQUAL(be8, -128);
-		VERIFY_EQUAL(memcmp(&le8, "\x80", 1), 0);
-		VERIFY_EQUAL(memcmp(&be8, "\x80", 1), 0);
-		int16le le16; le16.set(0x1234);
-		int16be be16; be16.set(0x1234);
-		VERIFY_EQUAL(le16, 0x1234);
-		VERIFY_EQUAL(be16, 0x1234);
-		VERIFY_EQUAL(memcmp(&le16, "\x34\x12", 2), 0);
-		VERIFY_EQUAL(memcmp(&be16, "\x12\x34", 2), 0);
-		uint32le le32; le32.set(0xFFEEDDCCu);
-		uint32be be32; be32.set(0xFFEEDDCCu);
-		VERIFY_EQUAL(le32, 0xFFEEDDCCu);
-		VERIFY_EQUAL(be32, 0xFFEEDDCCu);
-		VERIFY_EQUAL(memcmp(&le32, "\xCC\xDD\xEE\xFF", 4), 0);
-		VERIFY_EQUAL(memcmp(&be32, "\xFF\xEE\xDD\xCC", 4), 0);
-		uint64le le64; le64.set(0xDEADC0DE15C0FFEEull);
-		uint64be be64; be64.set(0xDEADC0DE15C0FFEEull);
-		VERIFY_EQUAL(le64, 0xDEADC0DE15C0FFEEull);
-		VERIFY_EQUAL(be64, 0xDEADC0DE15C0FFEEull);
-		VERIFY_EQUAL(memcmp(&le64, "\xEE\xFF\xC0\x15\xDE\xC0\xAD\xDE", 8), 0);
-		VERIFY_EQUAL(memcmp(&be64, "\xDE\xAD\xC0\xDE\x15\xC0\xFF\xEE", 8), 0);
-	}
-
 	VERIFY_EQUAL(ModCommand::IsPcNote(NOTE_MAX), false);
 	VERIFY_EQUAL(ModCommand::IsPcNote(NOTE_PC), true);
 	VERIFY_EQUAL(ModCommand::IsPcNote(NOTE_PCS), true);
@@ -999,637 +840,6 @@
 	VERIFY_EQUAL(CModSpecifications::ExtensionToType("s2m"), MOD_TYPE_NONE);
 	VERIFY_EQUAL(CModSpecifications::ExtensionToType(""), MOD_TYPE_NONE);
 
-	VERIFY_EQUAL( mpt::round(1.99), 2.0 );
-	VERIFY_EQUAL( mpt::round(1.5), 2.0 );
-	VERIFY_EQUAL( mpt::round(1.1), 1.0 );
-	VERIFY_EQUAL( mpt::round(-0.1), 0.0 );
-	VERIFY_EQUAL( mpt::round(-0.5), -1.0 );
-	VERIFY_EQUAL( mpt::round(-0.9), -1.0 );
-	VERIFY_EQUAL( mpt::round(-1.4), -1.0 );
-	VERIFY_EQUAL( mpt::round(-1.7), -2.0 );
-	VERIFY_EQUAL( mpt::saturate_round<int32>(int32_max + 0.1), int32_max );
-	VERIFY_EQUAL( mpt::saturate_round<int32>(int32_max - 0.4), int32_max );
-	VERIFY_EQUAL( mpt::saturate_round<int32>(int32_min + 0.1), int32_min );
-	VERIFY_EQUAL( mpt::saturate_round<int32>(int32_min - 0.1), int32_min );
-	VERIFY_EQUAL( mpt::saturate_round<uint32>(uint32_max + 0.499), uint32_max );
-	VERIFY_EQUAL( mpt::saturate_round<int8>(110.1), 110 );
-	VERIFY_EQUAL( mpt::saturate_round<int8>(-110.1), -110 );
-
-	VERIFY_EQUAL(mpt::popcount(static_cast<uint32>(int32(-1))), 32);
-	VERIFY_EQUAL(mpt::popcount(0u), 0);
-	VERIFY_EQUAL(mpt::popcount(1u), 1);
-	VERIFY_EQUAL(mpt::popcount(2u), 1);
-	VERIFY_EQUAL(mpt::popcount(3u), 2);
-
-	VERIFY_EQUAL(mpt::has_single_bit(0u), false);
-	VERIFY_EQUAL(mpt::has_single_bit(1u), true);
-	VERIFY_EQUAL(mpt::has_single_bit(2u), true);
-	VERIFY_EQUAL(mpt::has_single_bit(3u), false);
-	VERIFY_EQUAL(mpt::has_single_bit(4u), true);
-	VERIFY_EQUAL(mpt::has_single_bit(5u), false);
-	VERIFY_EQUAL(mpt::has_single_bit(6u), false);
-	VERIFY_EQUAL(mpt::has_single_bit(7u), false);
-	VERIFY_EQUAL(mpt::has_single_bit(8u), true);
-	VERIFY_EQUAL(mpt::has_single_bit(9u), false);
-	VERIFY_EQUAL(mpt::has_single_bit(uint32(0x7fffffffu)), false);
-	VERIFY_EQUAL(mpt::has_single_bit(uint32(0x80000000u)), true);
-	VERIFY_EQUAL(mpt::has_single_bit(uint32(0x80000001u)), false);
-	VERIFY_EQUAL(mpt::has_single_bit(uint32(0xfffffffeu)), false);
-	VERIFY_EQUAL(mpt::has_single_bit(uint32(0xffffffffu)), false);
-
-	VERIFY_EQUAL(mpt::bit_ceil(0u), 1u);
-	VERIFY_EQUAL(mpt::bit_ceil(1u), 1u);
-	VERIFY_EQUAL(mpt::bit_ceil(2u), 2u);
-	VERIFY_EQUAL(mpt::bit_ceil(3u), 4u);
-	VERIFY_EQUAL(mpt::bit_ceil(4u), 4u);
-	VERIFY_EQUAL(mpt::bit_ceil(5u), 8u);
-	VERIFY_EQUAL(mpt::bit_ceil(6u), 8u);
-	VERIFY_EQUAL(mpt::bit_ceil(7u), 8u);
-	VERIFY_EQUAL(mpt::bit_ceil(8u), 8u);
-	VERIFY_EQUAL(mpt::bit_ceil(9u), 16u);
-	VERIFY_EQUAL(mpt::bit_ceil(uint32(0x7fffffffu)), 0x80000000u);
-	VERIFY_EQUAL(mpt::bit_ceil(uint32(0x80000000u)), 0x80000000u);
-	//VERIFY_EQUAL(mpt::bit_ceil(uint32(0x80000001u)), 0u);
-	//VERIFY_EQUAL(mpt::bit_ceil(uint32(0xfffffffeu)), 0u);
-	//VERIFY_EQUAL(mpt::bit_ceil(uint32(0xffffffffu)), 0u);
-
-	VERIFY_EQUAL(mpt::bit_floor(0u), 0u);
-	VERIFY_EQUAL(mpt::bit_floor(1u), 1u);
-	VERIFY_EQUAL(mpt::bit_floor(2u), 2u);
-	VERIFY_EQUAL(mpt::bit_floor(3u), 2u);
-	VERIFY_EQUAL(mpt::bit_floor(4u), 4u);
-	VERIFY_EQUAL(mpt::bit_floor(5u), 4u);
-	VERIFY_EQUAL(mpt::bit_floor(6u), 4u);
-	VERIFY_EQUAL(mpt::bit_floor(7u), 4u);
-	VERIFY_EQUAL(mpt::bit_floor(8u), 8u);
-	VERIFY_EQUAL(mpt::bit_floor(9u), 8u);
-	VERIFY_EQUAL(mpt::bit_floor(uint32(0x7fffffffu)), 0x40000000u);
-	VERIFY_EQUAL(mpt::bit_floor(uint32(0x80000000u)), 0x80000000u);
-	VERIFY_EQUAL(mpt::bit_floor(uint32(0x80000001u)), 0x80000000u);
-	VERIFY_EQUAL(mpt::bit_floor(uint32(0xfffffffeu)), 0x80000000u);
-	VERIFY_EQUAL(mpt::bit_floor(uint32(0xffffffffu)), 0x80000000u);
-
-	VERIFY_EQUAL(mpt::bit_width(0u), 0u);
-	VERIFY_EQUAL(mpt::bit_width(1u), 1u);
-	VERIFY_EQUAL(mpt::bit_width(2u), 2u);
-	VERIFY_EQUAL(mpt::bit_width(3u), 2u);
-	VERIFY_EQUAL(mpt::bit_width(4u), 3u);
-	VERIFY_EQUAL(mpt::bit_width(5u), 3u);
-	VERIFY_EQUAL(mpt::bit_width(6u), 3u);
-	VERIFY_EQUAL(mpt::bit_width(7u), 3u);
-	VERIFY_EQUAL(mpt::bit_width(8u), 4u);
-	VERIFY_EQUAL(mpt::bit_width(9u), 4u);
-	VERIFY_EQUAL(mpt::bit_width(uint32(0x7fffffffu)), 31u);
-	VERIFY_EQUAL(mpt::bit_width(uint32(0x80000000u)), 32u);
-	VERIFY_EQUAL(mpt::bit_width(uint32(0x80000001u)), 32u);
-	VERIFY_EQUAL(mpt::bit_width(uint32(0xfffffffeu)), 32u);
-	VERIFY_EQUAL(mpt::bit_width(uint32(0xffffffffu)), 32u);
-
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b00000001)), 0);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b00000011)), 0);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b00000111)), 0);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b00001111)), 0);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b00011111)), 0);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b00111111)), 0);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b01111111)), 0);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b11111111)), 8);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b11111110)), 7);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b11111100)), 6);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b11111000)), 5);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b11110000)), 4);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b11100000)), 3);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b11000000)), 2);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b10000000)), 1);
-	VERIFY_EQUAL(mpt::countl_one(uint8(0b00000000)), 0);
-
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b00000001)), 7);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b00000011)), 6);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b00000111)), 5);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b00001111)), 4);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b00011111)), 3);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b00111111)), 2);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b01111111)), 1);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b11111111)), 0);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b11111110)), 0);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b11111100)), 0);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b11111000)), 0);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b11110000)), 0);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b11100000)), 0);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b11000000)), 0);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b10000000)), 0);
-	VERIFY_EQUAL(mpt::countl_zero(uint8(0b00000000)), 8);
-
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b00000001)), 1);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b00000011)), 2);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b00000111)), 3);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b00001111)), 4);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b00011111)), 5);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b00111111)), 6);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b01111111)), 7);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b11111111)), 8);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b11111110)), 0);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b11111100)), 0);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b11111000)), 0);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b11110000)), 0);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b11100000)), 0);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b11000000)), 0);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b10000000)), 0);
-	VERIFY_EQUAL(mpt::countr_one(uint8(0b00000000)), 0);
-
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b00000001)), 0);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b00000011)), 0);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b00000111)), 0);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b00001111)), 0);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b00011111)), 0);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b00111111)), 0);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b01111111)), 0);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b11111111)), 0);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b11111110)), 1);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b11111100)), 2);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b11111000)), 3);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b11110000)), 4);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b11100000)), 5);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b11000000)), 6);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b10000000)), 7);
-	VERIFY_EQUAL(mpt::countr_zero(uint8(0b00000000)), 8);
-
-	// trivials
-	VERIFY_EQUAL( mpt::saturate_cast<int>(-1), -1 );
-	VERIFY_EQUAL( mpt::saturate_cast<int>(0), 0 );
-	VERIFY_EQUAL( mpt::saturate_cast<int>(1), 1 );
-	VERIFY_EQUAL( mpt::saturate_cast<int>(std::numeric_limits<int>::min()), std::numeric_limits<int>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<int>(std::numeric_limits<int>::max()), std::numeric_limits<int>::max() );
-
-	// signed / unsigned
-	VERIFY_EQUAL( mpt::saturate_cast<int16>(std::numeric_limits<uint16>::min()), std::numeric_limits<uint16>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<int16>(std::numeric_limits<uint16>::max()), std::numeric_limits<int16>::max() );
-	VERIFY_EQUAL( mpt::saturate_cast<int32>(std::numeric_limits<uint32>::min()), (int32)std::numeric_limits<uint32>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<int32>(std::numeric_limits<uint32>::max()), std::numeric_limits<int32>::max() );
-	VERIFY_EQUAL( mpt::saturate_cast<int64>(std::numeric_limits<uint64>::min()), (int64)std::numeric_limits<uint64>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<int64>(std::numeric_limits<uint64>::max()), std::numeric_limits<int64>::max() );
-	VERIFY_EQUAL( mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min()), std::numeric_limits<uint16>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max()), std::numeric_limits<int16>::max() );
-	VERIFY_EQUAL( mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min()), std::numeric_limits<uint32>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max()), (uint32)std::numeric_limits<int32>::max() );
-	VERIFY_EQUAL( mpt::saturate_cast<uint64>(std::numeric_limits<int64>::min()), std::numeric_limits<uint64>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<uint64>(std::numeric_limits<int64>::max()), (uint64)std::numeric_limits<int64>::max() );
-
-	// overflow
-	VERIFY_EQUAL( mpt::saturate_cast<int16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<int16>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<int16>(std::numeric_limits<int16>::max() + 1), std::numeric_limits<int16>::max() );
-	VERIFY_EQUAL( mpt::saturate_cast<int32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<int32>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<int32>(std::numeric_limits<int32>::max() + int64(1)), std::numeric_limits<int32>::max() );
-
-	VERIFY_EQUAL( mpt::saturate_cast<uint16>(std::numeric_limits<int16>::min() - 1), std::numeric_limits<uint16>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max() + 1), (uint16)std::numeric_limits<int16>::max() + 1 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<uint32>::min() );
-	VERIFY_EQUAL( mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max() + int64(1)), (uint32)std::numeric_limits<int32>::max() + 1 );
-	
-	VERIFY_EQUAL( mpt::saturate_cast<int8>( int16(32000) ), 127 );
-	VERIFY_EQUAL( mpt::saturate_cast<int8>( int16(-32000) ), -128 );
-	VERIFY_EQUAL( mpt::saturate_cast<int8>( uint16(32000) ), 127 );
-	VERIFY_EQUAL( mpt::saturate_cast<int8>( uint16(64000) ), 127 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint8>( int16(32000) ), 255 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint8>( int16(-32000) ), 0 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint8>( uint16(32000) ), 255 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint8>( uint16(64000) ), 255 );
-	VERIFY_EQUAL( mpt::saturate_cast<int16>( int16(32000) ), 32000 );
-	VERIFY_EQUAL( mpt::saturate_cast<int16>( int16(-32000) ), -32000 );
-	VERIFY_EQUAL( mpt::saturate_cast<int16>( uint16(32000) ), 32000 );
-	VERIFY_EQUAL( mpt::saturate_cast<int16>( uint16(64000) ), 32767 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint16>( int16(32000) ), 32000 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint16>( int16(-32000) ), 0 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint16>( uint16(32000) ), 32000 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint16>( uint16(64000) ), 64000 );
-	VERIFY_EQUAL( mpt::saturate_cast<int32>( int16(32000) ), 32000 );
-	VERIFY_EQUAL( mpt::saturate_cast<int32>( int16(-32000) ), -32000 );
-	VERIFY_EQUAL( mpt::saturate_cast<int32>( uint16(32000) ), 32000 );
-	VERIFY_EQUAL( mpt::saturate_cast<int32>( uint16(64000) ), 64000 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint32>( int16(32000) ), 32000 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint32>( int16(-32000) ), 0 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint32>( uint16(32000) ), 32000 );
-	VERIFY_EQUAL( mpt::saturate_cast<uint32>( uint16(64000) ), 64000 );
-	
-	VERIFY_EQUAL( mpt::saturate_cast<uint32>(std::numeric_limits<int64>::max() - 1), std::numeric_limits<uint32>::max() );
-
-	VERIFY_EQUAL( mpt::saturate_cast<int32>(std::numeric_limits<uint64>::max() - 1), std::numeric_limits<int32>::max() );
-	
-	VERIFY_EQUAL( mpt::saturate_cast<uint32>(static_cast<double>(std::numeric_limits<int64>::max())), std::numeric_limits<uint32>::max() );
-
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32768,  1), mpt::rshift_signed_standard<int16>(-32768,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32767,  1), mpt::rshift_signed_standard<int16>(-32767,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32766,  1), mpt::rshift_signed_standard<int16>(-32766,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -2,  1), mpt::rshift_signed_standard<int16>(    -2,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -1,  1), mpt::rshift_signed_standard<int16>(    -1,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     0,  1), mpt::rshift_signed_standard<int16>(     0,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     1,  1), mpt::rshift_signed_standard<int16>(     1,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     2,  1), mpt::rshift_signed_standard<int16>(     2,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32766,  1), mpt::rshift_signed_standard<int16>( 32766,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32767,  1), mpt::rshift_signed_standard<int16>( 32767,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32768, 14), mpt::rshift_signed_standard<int16>(-32768, 14));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32767, 14), mpt::rshift_signed_standard<int16>(-32767, 14));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32766, 14), mpt::rshift_signed_standard<int16>(-32766, 14));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -2, 14), mpt::rshift_signed_standard<int16>(    -2, 14));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -1, 14), mpt::rshift_signed_standard<int16>(    -1, 14));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     0, 14), mpt::rshift_signed_standard<int16>(     0, 14));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     1, 14), mpt::rshift_signed_standard<int16>(     1, 14));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     2, 14), mpt::rshift_signed_standard<int16>(     2, 14));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32766, 14), mpt::rshift_signed_standard<int16>( 32766, 14));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32767, 14), mpt::rshift_signed_standard<int16>( 32767, 14));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32768, 15), mpt::rshift_signed_standard<int16>(-32768, 15));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32767, 15), mpt::rshift_signed_standard<int16>(-32767, 15));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32766, 15), mpt::rshift_signed_standard<int16>(-32766, 15));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -2, 15), mpt::rshift_signed_standard<int16>(    -2, 15));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -1, 15), mpt::rshift_signed_standard<int16>(    -1, 15));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     0, 15), mpt::rshift_signed_standard<int16>(     0, 15));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     1, 15), mpt::rshift_signed_standard<int16>(     1, 15));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     2, 15), mpt::rshift_signed_standard<int16>(     2, 15));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32766, 15), mpt::rshift_signed_standard<int16>( 32766, 15));
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32767, 15), mpt::rshift_signed_standard<int16>( 32767, 15));
-
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32768,  1), mpt::lshift_signed_standard<int16>(-32768,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32767,  1), mpt::lshift_signed_standard<int16>(-32767,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32766,  1), mpt::lshift_signed_standard<int16>(-32766,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -2,  1), mpt::lshift_signed_standard<int16>(    -2,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -1,  1), mpt::lshift_signed_standard<int16>(    -1,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     0,  1), mpt::lshift_signed_standard<int16>(     0,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     1,  1), mpt::lshift_signed_standard<int16>(     1,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     2,  1), mpt::lshift_signed_standard<int16>(     2,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32766,  1), mpt::lshift_signed_standard<int16>( 32766,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32767,  1), mpt::lshift_signed_standard<int16>( 32767,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32768, 14), mpt::lshift_signed_standard<int16>(-32768, 14));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32767, 14), mpt::lshift_signed_standard<int16>(-32767, 14));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32766, 14), mpt::lshift_signed_standard<int16>(-32766, 14));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -2, 14), mpt::lshift_signed_standard<int16>(    -2, 14));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -1, 14), mpt::lshift_signed_standard<int16>(    -1, 14));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     0, 14), mpt::lshift_signed_standard<int16>(     0, 14));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     1, 14), mpt::lshift_signed_standard<int16>(     1, 14));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     2, 14), mpt::lshift_signed_standard<int16>(     2, 14));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32766, 14), mpt::lshift_signed_standard<int16>( 32766, 14));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32767, 14), mpt::lshift_signed_standard<int16>( 32767, 14));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32768, 15), mpt::lshift_signed_standard<int16>(-32768, 15));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32767, 15), mpt::lshift_signed_standard<int16>(-32767, 15));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32766, 15), mpt::lshift_signed_standard<int16>(-32766, 15));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -2, 15), mpt::lshift_signed_standard<int16>(    -2, 15));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -1, 15), mpt::lshift_signed_standard<int16>(    -1, 15));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     0, 15), mpt::lshift_signed_standard<int16>(     0, 15));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     1, 15), mpt::lshift_signed_standard<int16>(     1, 15));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     2, 15), mpt::lshift_signed_standard<int16>(     2, 15));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32766, 15), mpt::lshift_signed_standard<int16>( 32766, 15));
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32767, 15), mpt::lshift_signed_standard<int16>( 32767, 15));
-
-#if MPT_COMPILER_SHIFT_SIGNED
-
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32768,  1), (-32768) >>  1);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32767,  1), (-32767) >>  1);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32766,  1), (-32766) >>  1);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -2,  1), (    -2) >>  1);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -1,  1), (    -1) >>  1);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     0,  1), (     0) >>  1);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     1,  1), (     1) >>  1);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     2,  1), (     2) >>  1);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32766,  1), ( 32766) >>  1);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32767,  1), ( 32767) >>  1);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32768, 14), (-32768) >> 14);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32767, 14), (-32767) >> 14);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32766, 14), (-32766) >> 14);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -2, 14), (    -2) >> 14);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -1, 14), (    -1) >> 14);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     0, 14), (     0) >> 14);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     1, 14), (     1) >> 14);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     2, 14), (     2) >> 14);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32766, 14), ( 32766) >> 14);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32767, 14), ( 32767) >> 14);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32768, 15), (-32768) >> 15);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32767, 15), (-32767) >> 15);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(-32766, 15), (-32766) >> 15);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -2, 15), (    -2) >> 15);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(    -1, 15), (    -1) >> 15);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     0, 15), (     0) >> 15);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     1, 15), (     1) >> 15);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>(     2, 15), (     2) >> 15);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32766, 15), ( 32766) >> 15);
-	VERIFY_EQUAL(mpt::rshift_signed<int16>( 32767, 15), ( 32767) >> 15);
-
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32768,  1), (-32768) <<  1);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32767,  1), (-32767) <<  1);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32766,  1), (-32766) <<  1);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -2,  1), (    -2) <<  1);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -1,  1), (    -1) <<  1);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     0,  1), (     0) <<  1);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     1,  1), (     1) <<  1);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     2,  1), (     2) <<  1);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32766,  1), ( 32766) <<  1);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32767,  1), ( 32767) <<  1);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32768, 14), (-32768) << 14);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32767, 14), (-32767) << 14);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32766, 14), (-32766) << 14);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -2, 14), (    -2) << 14);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -1, 14), (    -1) << 14);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     0, 14), (     0) << 14);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     1, 14), (     1) << 14);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     2, 14), (     2) << 14);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32766, 14), ( 32766) << 14);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32767, 14), ( 32767) << 14);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32768, 15), (-32768) << 15);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32767, 15), (-32767) << 15);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(-32766, 15), (-32766) << 15);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -2, 15), (    -2) << 15);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(    -1, 15), (    -1) << 15);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     0, 15), (     0) << 15);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     1, 15), (     1) << 15);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>(     2, 15), (     2) << 15);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32766, 15), ( 32766) << 15);
-	VERIFY_EQUAL(mpt::lshift_signed<int16>( 32767, 15), ( 32767) << 15);
-
-#endif
-
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(0-0x80000000,  1), mpt::rshift_signed_standard<int32>(0-0x80000000,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff,  1), mpt::rshift_signed_standard<int32>(-0x7fffffff,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe,  1), mpt::rshift_signed_standard<int32>(-0x7ffffffe,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(         -1,  1), mpt::rshift_signed_standard<int32>(         -1,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(          0,  1), mpt::rshift_signed_standard<int32>(          0,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(          1,  1), mpt::rshift_signed_standard<int32>(          1,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>( 0x7ffffffe,  1), mpt::rshift_signed_standard<int32>( 0x7ffffffe,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>( 0x7fffffff,  1), mpt::rshift_signed_standard<int32>( 0x7fffffff,  1));
-
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(0-0x80000000, 31), mpt::rshift_signed_standard<int32>(0-0x80000000, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_standard<int32>(-0x7fffffff, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_standard<int32>(-0x7ffffffe, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(         -1, 31), mpt::rshift_signed_standard<int32>(         -1, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(          0, 31), mpt::rshift_signed_standard<int32>(          0, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(          1, 31), mpt::rshift_signed_standard<int32>(          1, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>( 0x7ffffffe, 31), mpt::rshift_signed_standard<int32>( 0x7ffffffe, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>( 0x7fffffff, 31), mpt::rshift_signed_standard<int32>( 0x7fffffff, 31));
-
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(0-0x80000000,  1), mpt::lshift_signed_standard<int32>(0-0x80000000,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff,  1), mpt::lshift_signed_standard<int32>(-0x7fffffff,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe,  1), mpt::lshift_signed_standard<int32>(-0x7ffffffe,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(         -1,  1), mpt::lshift_signed_standard<int32>(         -1,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(          0,  1), mpt::lshift_signed_standard<int32>(          0,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(          1,  1), mpt::lshift_signed_standard<int32>(          1,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>( 0x7ffffffe,  1), mpt::lshift_signed_standard<int32>( 0x7ffffffe,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>( 0x7fffffff,  1), mpt::lshift_signed_standard<int32>( 0x7fffffff,  1));
-
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(0-0x80000000, 31), mpt::lshift_signed_standard<int32>(0-0x80000000, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_standard<int32>(-0x7fffffff, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_standard<int32>(-0x7ffffffe, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(         -1, 31), mpt::lshift_signed_standard<int32>(         -1, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(          0, 31), mpt::lshift_signed_standard<int32>(          0, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(          1, 31), mpt::lshift_signed_standard<int32>(          1, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>( 0x7ffffffe, 31), mpt::lshift_signed_standard<int32>( 0x7ffffffe, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>( 0x7fffffff, 31), mpt::lshift_signed_standard<int32>( 0x7fffffff, 31));
-
-#if MPT_COMPILER_SHIFT_SIGNED
-
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(0-0x80000000,  1), mpt::rshift_signed_undefined<int32>(0-0x80000000,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff,  1), mpt::rshift_signed_undefined<int32>(-0x7fffffff,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe,  1), mpt::rshift_signed_undefined<int32>(-0x7ffffffe,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(         -1,  1), mpt::rshift_signed_undefined<int32>(         -1,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(          0,  1), mpt::rshift_signed_undefined<int32>(          0,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(          1,  1), mpt::rshift_signed_undefined<int32>(          1,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>( 0x7ffffffe,  1), mpt::rshift_signed_undefined<int32>( 0x7ffffffe,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>( 0x7fffffff,  1), mpt::rshift_signed_undefined<int32>( 0x7fffffff,  1));
-
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(0-0x80000000, 31), mpt::rshift_signed_undefined<int32>(0-0x80000000, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(-0x7fffffff, 31), mpt::rshift_signed_undefined<int32>(-0x7fffffff, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(-0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>(-0x7ffffffe, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(         -1, 31), mpt::rshift_signed_undefined<int32>(         -1, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(          0, 31), mpt::rshift_signed_undefined<int32>(          0, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>(          1, 31), mpt::rshift_signed_undefined<int32>(          1, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>( 0x7ffffffe, 31), mpt::rshift_signed_undefined<int32>( 0x7ffffffe, 31));
-	VERIFY_EQUAL(mpt::rshift_signed<int32>( 0x7fffffff, 31), mpt::rshift_signed_undefined<int32>( 0x7fffffff, 31));
-
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(0-0x80000000,  1), mpt::lshift_signed_undefined<int32>(0-0x80000000,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff,  1), mpt::lshift_signed_undefined<int32>(-0x7fffffff,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe,  1), mpt::lshift_signed_undefined<int32>(-0x7ffffffe,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(         -1,  1), mpt::lshift_signed_undefined<int32>(         -1,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(          0,  1), mpt::lshift_signed_undefined<int32>(          0,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(          1,  1), mpt::lshift_signed_undefined<int32>(          1,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>( 0x7ffffffe,  1), mpt::lshift_signed_undefined<int32>( 0x7ffffffe,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>( 0x7fffffff,  1), mpt::lshift_signed_undefined<int32>( 0x7fffffff,  1));
-
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(0-0x80000000, 31), mpt::lshift_signed_undefined<int32>(0-0x80000000, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(-0x7fffffff, 31), mpt::lshift_signed_undefined<int32>(-0x7fffffff, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(-0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>(-0x7ffffffe, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(         -1, 31), mpt::lshift_signed_undefined<int32>(         -1, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(          0, 31), mpt::lshift_signed_undefined<int32>(          0, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>(          1, 31), mpt::lshift_signed_undefined<int32>(          1, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>( 0x7ffffffe, 31), mpt::lshift_signed_undefined<int32>( 0x7ffffffe, 31));
-	VERIFY_EQUAL(mpt::lshift_signed<int32>( 0x7fffffff, 31), mpt::lshift_signed_undefined<int32>( 0x7fffffff, 31));
-
-#endif
-	
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(0ull-0x8000000000000000ull,  1), mpt::rshift_signed_standard<int64>(0ull-0x8000000000000000ull,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll,  1), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell,  1), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                 -1ll,  1), mpt::rshift_signed_standard<int64>(                 -1ll,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                  0ll,  1), mpt::rshift_signed_standard<int64>(                  0ll,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                  1ll,  1), mpt::rshift_signed_standard<int64>(                  1ll,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>( 0x7ffffffffffffffell,  1), mpt::rshift_signed_standard<int64>( 0x7ffffffffffffffell,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>( 0x7fffffffffffffffll,  1), mpt::rshift_signed_standard<int64>( 0x7fffffffffffffffll,  1));
-
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(0ull-0x8000000000000000ull, 63), mpt::rshift_signed_standard<int64>(0ull-0x8000000000000000ull, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                 -1ll, 63), mpt::rshift_signed_standard<int64>(                 -1ll, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                  0ll, 63), mpt::rshift_signed_standard<int64>(                  0ll, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                  1ll, 63), mpt::rshift_signed_standard<int64>(                  1ll, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>( 0x7ffffffffffffffell, 63), mpt::rshift_signed_standard<int64>( 0x7ffffffffffffffell, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>( 0x7fffffffffffffffll, 63), mpt::rshift_signed_standard<int64>( 0x7fffffffffffffffll, 63));
-
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(0ull-0x8000000000000000ull,  1), mpt::lshift_signed_standard<int64>(0ull-0x8000000000000000ull,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll,  1), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell,  1), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                 -1ll,  1), mpt::lshift_signed_standard<int64>(                 -1ll,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                  0ll,  1), mpt::lshift_signed_standard<int64>(                  0ll,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                  1ll,  1), mpt::lshift_signed_standard<int64>(                  1ll,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>( 0x7ffffffffffffffell,  1), mpt::lshift_signed_standard<int64>( 0x7ffffffffffffffell,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>( 0x7fffffffffffffffll,  1), mpt::lshift_signed_standard<int64>( 0x7fffffffffffffffll,  1));
-
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(0ull-0x8000000000000000ull, 63), mpt::lshift_signed_standard<int64>(0ull-0x8000000000000000ull, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>(-0x7fffffffffffffffll, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>(-0x7ffffffffffffffell, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                 -1ll, 63), mpt::lshift_signed_standard<int64>(                 -1ll, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                  0ll, 63), mpt::lshift_signed_standard<int64>(                  0ll, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                  1ll, 63), mpt::lshift_signed_standard<int64>(                  1ll, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>( 0x7ffffffffffffffell, 63), mpt::lshift_signed_standard<int64>( 0x7ffffffffffffffell, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>( 0x7fffffffffffffffll, 63), mpt::lshift_signed_standard<int64>( 0x7fffffffffffffffll, 63));
-
-#if MPT_COMPILER_SHIFT_SIGNED
-
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(0ull-0x8000000000000000ull,  1), mpt::rshift_signed_undefined<int64>(0ull-0x8000000000000000ull,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll,  1), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell,  1), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                 -1ll,  1), mpt::rshift_signed_undefined<int64>(                 -1ll,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                  0ll,  1), mpt::rshift_signed_undefined<int64>(                  0ll,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                  1ll,  1), mpt::rshift_signed_undefined<int64>(                  1ll,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>( 0x7ffffffffffffffell,  1), mpt::rshift_signed_undefined<int64>( 0x7ffffffffffffffell,  1));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>( 0x7fffffffffffffffll,  1), mpt::rshift_signed_undefined<int64>( 0x7fffffffffffffffll,  1));
-
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(0ull-0x8000000000000000ull, 63), mpt::rshift_signed_undefined<int64>(0ull-0x8000000000000000ull, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                 -1ll, 63), mpt::rshift_signed_undefined<int64>(                 -1ll, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                  0ll, 63), mpt::rshift_signed_undefined<int64>(                  0ll, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>(                  1ll, 63), mpt::rshift_signed_undefined<int64>(                  1ll, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>( 0x7ffffffffffffffell, 63), mpt::rshift_signed_undefined<int64>( 0x7ffffffffffffffell, 63));
-	VERIFY_EQUAL(mpt::rshift_signed<int64>( 0x7fffffffffffffffll, 63), mpt::rshift_signed_undefined<int64>( 0x7fffffffffffffffll, 63));
-
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(0ull-0x8000000000000000ull,  1), mpt::lshift_signed_undefined<int64>(0ull-0x8000000000000000ull,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll,  1), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell,  1), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                 -1ll,  1), mpt::lshift_signed_undefined<int64>(                 -1ll,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                  0ll,  1), mpt::lshift_signed_undefined<int64>(                  0ll,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                  1ll,  1), mpt::lshift_signed_undefined<int64>(                  1ll,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>( 0x7ffffffffffffffell,  1), mpt::lshift_signed_undefined<int64>( 0x7ffffffffffffffell,  1));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>( 0x7fffffffffffffffll,  1), mpt::lshift_signed_undefined<int64>( 0x7fffffffffffffffll,  1));
-
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(0ull-0x8000000000000000ull, 63), mpt::lshift_signed_undefined<int64>(0ull-0x8000000000000000ull, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(-0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>(-0x7fffffffffffffffll, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(-0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>(-0x7ffffffffffffffell, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                 -1ll, 63), mpt::lshift_signed_undefined<int64>(                 -1ll, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                  0ll, 63), mpt::lshift_signed_undefined<int64>(                  0ll, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>(                  1ll, 63), mpt::lshift_signed_undefined<int64>(                  1ll, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>( 0x7ffffffffffffffell, 63), mpt::lshift_signed_undefined<int64>( 0x7ffffffffffffffell, 63));
-	VERIFY_EQUAL(mpt::lshift_signed<int64>( 0x7fffffffffffffffll, 63), mpt::lshift_signed_undefined<int64>( 0x7fffffffffffffffll, 63));
-
-#endif
-
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(-25, 12), 11);
-	VERIFY_EQUAL(mpt::wrapping_modulo(-24, 12), 0);
-	VERIFY_EQUAL(mpt::wrapping_modulo(-23, 12), 1);
-	VERIFY_EQUAL(mpt::wrapping_modulo(-8, 7), 6);
-	VERIFY_EQUAL(mpt::wrapping_modulo(-7, 7), 0);
-	VERIFY_EQUAL(mpt::wrapping_modulo(-6, 7), 1);
-	VERIFY_EQUAL(mpt::wrapping_modulo(-5, 7), 2);
-	VERIFY_EQUAL(mpt::wrapping_modulo(-4, 7), 3);
-	VERIFY_EQUAL(mpt::wrapping_modulo(-3, 7), 4);
-	VERIFY_EQUAL(mpt::wrapping_modulo(-2, 7), 5);
-	VERIFY_EQUAL(mpt::wrapping_modulo(-1, 7), 6);
-	VERIFY_EQUAL(mpt::wrapping_modulo(0, 12), 0);
-	VERIFY_EQUAL(mpt::wrapping_modulo(0, 7), 0);
-	VERIFY_EQUAL(mpt::wrapping_modulo(1, 7), 1);
-	VERIFY_EQUAL(mpt::wrapping_modulo(2, 7), 2);
-	VERIFY_EQUAL(mpt::wrapping_modulo(3, 7), 3);
-	VERIFY_EQUAL(mpt::wrapping_modulo(4, 7), 4);
-	VERIFY_EQUAL(mpt::wrapping_modulo(5, 7), 5);
-	VERIFY_EQUAL(mpt::wrapping_modulo(6, 7), 6);
-	VERIFY_EQUAL(mpt::wrapping_modulo(7, 7), 0);
-	VERIFY_EQUAL(mpt::wrapping_modulo(8, 7), 1);
-	VERIFY_EQUAL(mpt::wrapping_modulo(23, 12), 11);
-	VERIFY_EQUAL(mpt::wrapping_modulo(24, 12), 0);
-	VERIFY_EQUAL(mpt::wrapping_modulo(25, 12), 1);
-	VERIFY_EQUAL(mpt::wrapping_modulo(uint32(0x7fffffff), uint32(0x80000000)), uint32(0x7fffffff));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(0x7ffffffe), int32(0x7fffffff)), int32(0x7ffffffe));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(1)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(2)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(1)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), int32(2)), int32(1));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(1)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), int32(2)), int32(0));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7fffffff)), int32(0x7ffffffe));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff)  , int32(0x7fffffff)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe)  , int32(0x7fffffff)), int32(1));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffe)), int32(0x7ffffffc));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff)  , int32(0x7ffffffe)), int32(0x7ffffffd));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe)  , int32(0x7ffffffe)), int32(0));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), int32(0x7ffffffd)), int32(0x7ffffffa));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff)  , int32(0x7ffffffd)), int32(0x7ffffffb));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe)  , int32(0x7ffffffd)), int32(0x7ffffffc));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(0) , int32(0x7fffffff)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7fffffff)), int32(0x7ffffffe));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7fffffff)), int32(0x7ffffffd));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(0) , int32(0x7ffffffe)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-1), int32(0x7ffffffe)), int32(0x7ffffffd));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-2), int32(0x7ffffffe)), int32(0x7ffffffc));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(1)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(2)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(1)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff), uint32(2)), int32(1));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(1)), int32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe), uint32(2)), int32(0));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x40000001)  , uint32(0xffffffff)), uint32(0xbffffffe));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x40000000)  , uint32(0xffffffff)), uint32(0xbfffffff));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x3fffffff)  , uint32(0xffffffff)), uint32(0xc0000000));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff)  , uint32(0x80000000)), uint32(1));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe)  , uint32(0x80000000)), uint32(2));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000001)), uint32(1));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff)  , uint32(0x80000001)), uint32(2));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe)  , uint32(0x80000001)), uint32(3));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x80000000)), uint32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff)  , uint32(0x80000000)), uint32(1));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe)  , uint32(0x80000000)), uint32(2));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7fffffff)), uint32(0x7ffffffe));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff)  , uint32(0x7fffffff)), uint32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe)  , uint32(0x7fffffff)), uint32(1));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffe)), uint32(0x7ffffffc));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff)  , uint32(0x7ffffffe)), uint32(0x7ffffffd));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe)  , uint32(0x7ffffffe)), uint32(0));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x80000000ll), uint32(0x7ffffffd)), uint32(0x7ffffffa));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7fffffff)  , uint32(0x7ffffffd)), uint32(0x7ffffffb));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-0x7ffffffe)  , uint32(0x7ffffffd)), uint32(0x7ffffffc));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(0) , uint32(0x7fffffff)), uint32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7fffffff)), uint32(0x7ffffffe));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7fffffff)), uint32(0x7ffffffd));
-
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(0) , uint32(0x7ffffffe)), uint32(0));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-1), uint32(0x7ffffffe)), uint32(0x7ffffffd));
-	VERIFY_EQUAL(mpt::wrapping_modulo(int32(-2), uint32(0x7ffffffe)), uint32(0x7ffffffc));
-
-	VERIFY_EQUAL(mpt::wrapping_divide(-15, 7), -3);
-	VERIFY_EQUAL(mpt::wrapping_divide(-14, 7), -2);
-	VERIFY_EQUAL(mpt::wrapping_divide(-13, 7), -2);
-	VERIFY_EQUAL(mpt::wrapping_divide(-12, 7), -2);
-	VERIFY_EQUAL(mpt::wrapping_divide(-11, 7), -2);
-	VERIFY_EQUAL(mpt::wrapping_divide(-10, 7), -2);
-	VERIFY_EQUAL(mpt::wrapping_divide(-9, 7), -2);
-	VERIFY_EQUAL(mpt::wrapping_divide(-8, 7), -2);
-	VERIFY_EQUAL(mpt::wrapping_divide(-7, 7), -1);
-	VERIFY_EQUAL(mpt::wrapping_divide(-6, 7), -1);
-	VERIFY_EQUAL(mpt::wrapping_divide(-5, 7), -1);
-	VERIFY_EQUAL(mpt::wrapping_divide(-4, 7), -1);
-	VERIFY_EQUAL(mpt::wrapping_divide(-3, 7), -1);
-	VERIFY_EQUAL(mpt::wrapping_divide(-2, 7), -1);
-	VERIFY_EQUAL(mpt::wrapping_divide(-1, 7), -1);
-	VERIFY_EQUAL(mpt::wrapping_divide(0, 7), 0);
-	VERIFY_EQUAL(mpt::wrapping_divide(1, 7), 0);
-	VERIFY_EQUAL(mpt::wrapping_divide(2, 7), 0);
-	VERIFY_EQUAL(mpt::wrapping_divide(3, 7), 0);
-	VERIFY_EQUAL(mpt::wrapping_divide(4, 7), 0);
-	VERIFY_EQUAL(mpt::wrapping_divide(5, 7), 0);
-	VERIFY_EQUAL(mpt::wrapping_divide(6, 7), 0);
-	VERIFY_EQUAL(mpt::wrapping_divide(7, 7), 1);
-	VERIFY_EQUAL(mpt::wrapping_divide(8, 7), 1);
-	VERIFY_EQUAL(mpt::wrapping_divide(9, 7), 1);
-	VERIFY_EQUAL(mpt::wrapping_divide(10, 7), 1);
-	VERIFY_EQUAL(mpt::wrapping_divide(11, 7), 1);
-	VERIFY_EQUAL(mpt::wrapping_divide(12, 7), 1);
-	VERIFY_EQUAL(mpt::wrapping_divide(13, 7), 1);
-	VERIFY_EQUAL(mpt::wrapping_divide(14, 7), 2);
-	VERIFY_EQUAL(mpt::wrapping_divide(15, 7), 2);
-
 }
 
 
@@ -1645,76 +855,6 @@
 	VERIFY_EQUAL( mpt::String::RTrim(std::string("\0\ta\0b ",6)), std::string("\0\ta\0b",5) );
 	VERIFY_EQUAL( mpt::String::Trim(std::string("\0\ta\0b\0",6),std::string("\0",1)), std::string("\ta\0b",4) );
 
-	{
-		std::string expecteds = std::string("pleasure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(Util::BinToBase64(mpt::as_span(expected)), U_("cGxlYXN1cmUu"));
-	}
-	{
-		std::string expecteds = std::string("leasure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(Util::BinToBase64(mpt::as_span(expected)), U_("bGVhc3VyZS4="));
-	}
-	{
-		std::string expecteds = std::string("easure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(Util::BinToBase64(mpt::as_span(expected)), U_("ZWFzdXJlLg=="));
-	}
-	{
-		std::string expecteds = std::string("pleasure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(expected, Util::Base64ToBin(U_("cGxlYXN1cmUu")));
-	}
-	{
-		std::string expecteds = std::string("leasure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(expected, Util::Base64ToBin(U_("bGVhc3VyZS4=")));
-	}
-	{
-		std::string expecteds = std::string("easure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(expected, Util::Base64ToBin(U_("ZWFzdXJlLg==")));
-	}
-
-	{
-		std::string expecteds = std::string("pleasure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(Util::BinToBase64url(mpt::as_span(expected)), U_("cGxlYXN1cmUu"));
-	}
-	{
-		std::string expecteds = std::string("leasure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(Util::BinToBase64url(mpt::as_span(expected)), U_("bGVhc3VyZS4"));
-	}
-	{
-		std::string expecteds = std::string("easure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(Util::BinToBase64url(mpt::as_span(expected)), U_("ZWFzdXJlLg"));
-	}
-	{
-		std::string expecteds = std::string("pleasure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(expected, Util::Base64urlToBin(U_("cGxlYXN1cmUu")));
-	}
-	{
-		std::string expecteds = std::string("leasure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(expected, Util::Base64urlToBin(U_("bGVhc3VyZS4")));
-	}
-	{
-		std::string expecteds = std::string("easure.");
-		std::vector<std::byte> expected(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data(), mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).data() + mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(expecteds)).size());
-		VERIFY_EQUAL(expected, Util::Base64urlToBin(U_("ZWFzdXJlLg")));
-	}
-
-	// These should fail to compile
-	//mpt::saturate_round<std::string>(1.0);
-	//mpt::saturate_round<int64>(1.0);
-	//mpt::saturate_round<uint64>(1.0);
-
-	// This should trigger assert in Round.
-	//VERIFY_EQUAL( mpt::saturate_round<int8>(-129), 0 );
-
 	// Check for completeness of supported effect list in mod specifications
 	for(const auto &spec : ModSpecs::Collection)
 	{
@@ -1722,65 +862,6 @@
 		VERIFY_EQUAL(strlen(spec->volcommands), (size_t)MAX_VOLCMDS);
 	}
 
-	// UUID
-	{
-		VERIFY_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull).ToUString(), U_("2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"));
-		#if defined(MODPLUG_TRACKER) || defined(MPT_WITH_DMO)
-			constexpr mpt::UUID uuid_tmp = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
-			VERIFY_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid_tmp);
-			VERIFY_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(Util::StringToGUID(_T("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
-			VERIFY_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), mpt::UUID(Util::StringToCLSID(_T("{2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32}"))));
-			VERIFY_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull), mpt::UUID(Util::StringToGUID(_T("{00112233-4455-6677-8899-AABBCCDDEEFF}"))));
-			VERIFY_EQUAL(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull), mpt::UUID(Util::StringToGUID(_T("{00112233-4455-6677-C899-AABBCCDDEEFF}"))));
-			VERIFY_EQUAL(Util::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0x8899AABBCCDDEEFFull)), _T("{00112233-4455-6677-8899-AABBCCDDEEFF}"));
-			VERIFY_EQUAL(Util::GUIDToString(mpt::UUID(0x00112233u, 0x4455, 0x6677, 0xC899AABBCCDDEEFFull)), _T("{00112233-4455-6677-C899-AABBCCDDEEFF}"));
-		#endif
-
-#if defined(MODPLUG_TRACKER) || defined(MPT_WITH_DMO)
-	VERIFY_EQUAL(Util::IsValid(Util::CreateGUID()), true);
-	{
-		mpt::UUID uuid = mpt::UUID::Generate();
-		VERIFY_EQUAL(uuid, mpt::UUID::FromString(mpt::UUID(uuid).ToUString()));
-		VERIFY_EQUAL(uuid, mpt::UUID(Util::StringToGUID(Util::GUIDToString(uuid))));
-		VERIFY_EQUAL(uuid, mpt::UUID(Util::StringToIID(Util::IIDToString(uuid))));
-		VERIFY_EQUAL(uuid, mpt::UUID(Util::StringToCLSID(Util::CLSIDToString(uuid))));
-	}
-	{
-		GUID guid = mpt::UUID::Generate();
-		VERIFY_EQUAL(IsEqualGUID(guid, static_cast<GUID>(mpt::UUID::FromString(mpt::UUID(guid).ToUString()))), TRUE);
-		VERIFY_EQUAL(IsEqualGUID(guid, Util::StringToGUID(Util::GUIDToString(guid))), TRUE);
-		VERIFY_EQUAL(IsEqualGUID(guid, Util::StringToIID(Util::IIDToString(guid))), TRUE);
-		VERIFY_EQUAL(IsEqualGUID(guid, Util::StringToCLSID(Util::CLSIDToString(guid))), TRUE);
-	}
-#endif
-	VERIFY_EQUAL(mpt::UUID::Generate().IsValid(), true);
-	VERIFY_EQUAL(mpt::UUID::GenerateLocalUseOnly().IsValid(), true);
-	VERIFY_EQUAL(mpt::UUID::Generate() != mpt::UUID::Generate(), true);
-	mpt::UUID a = mpt::UUID::Generate();
-	VERIFY_EQUAL(a, mpt::UUID::FromString(a.ToUString()));
-	std::byte uuiddata[16]{};
-	for(std::size_t i = 0; i < 16; ++i)
-	{
-		uuiddata[i] = mpt::byte_cast<std::byte>(static_cast<uint8>(i));
-	}
-	static_assert(sizeof(mpt::UUID) == 16);
-	UUIDbin uuid2;
-	std::memcpy(&uuid2, uuiddata, 16);
-	VERIFY_EQUAL(mpt::UUID(uuid2).ToUString(), U_("00010203-0405-0607-0809-0a0b0c0d0e0f"));
-	}
-
-	constexpr mpt::UUID uuid3 = "2ed6593a-dfe6-4cf8-b2e5-75ad7f600c32"_uuid;
-	VERIFY_EQUAL(mpt::UUID(0x2ed6593au, 0xdfe6, 0x4cf8, 0xb2e575ad7f600c32ull), uuid3);
-
-#if defined(MODPLUG_TRACKER)
-	{
-		constexpr mpt::UUID uuid_ns_dns = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"_uuid;
-		constexpr mpt::UUID expected = "74738ff5-5367-5958-9aee-98fffdcd1876"_uuid;
-		mpt::UUID gotten = mpt::UUIDRFC4122NamespaceV5(uuid_ns_dns, U_("www.example.org"));
-		VERIFY_EQUAL(gotten, expected);
-	}
-#endif
-
 	// check that empty stringstream behaves correctly with our MSVC workarounds when using iostream interface directly
 
 	{ std::ostringstream ss; VERIFY_EQUAL(ss.tellp(), std::streampos(0)); }
@@ -2227,8 +1308,6 @@
 #ifdef MPT_WITH_MINIZ
 	VERIFY_EQUAL(mz_crc32(0, mpt::byte_cast<const unsigned char*>(std::string("123456789").c_str()), 9), 0xCBF43926u);
 #endif
-	VERIFY_EQUAL(mpt::crc32(std::string("123456789")), 0xCBF43926u);
-	VERIFY_EQUAL(mpt::crc32_ogg(std::string("123456789")), 0x89a1897fu);
 
 	// Check floating-point accuracy in TransposeToFrequency
 	static constexpr int32 transposeToFrequency[] =
@@ -2515,51 +1594,10 @@
 static MPT_NOINLINE void TestRandom()
 {
 
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0xffffffffu), 32);
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0xfffffffeu), 31);
+	#ifdef FLAKY_TESTS
 
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x80000000u), 31);
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x7fffffffu), 31);
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x7ffffffeu), 30);
+		mpt::default_prng& prng = *s_PRNG;
 
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x00000007u), 3);
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x00000006u), 2);
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x00000005u), 2);
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x00000004u), 2);
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x00000003u), 2);
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x00000002u), 1);
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x00000001u), 1);
-	VERIFY_EQUAL(mpt::detail::lower_bound_entropy_bits(0x00000000u), 0);
-
-	mpt::default_prng & prng = *s_PRNG;
-	for(std::size_t i = 0; i < 10000; ++i)
-	{
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<uint16, 7>(prng), 0u, 127u), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<uint16, 8>(prng), 0u, 255u), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<uint16, 9>(prng), 0u, 511u), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<uint64, 1>(prng), 0u, 1u), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<uint16>(prng, 7), 0u, 127u), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<uint16>(prng, 8), 0u, 255u), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<uint16>(prng, 9), 0u, 511u), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<uint64>(prng, 1), 0u, 1u), true);
-
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<int16, 7>(prng), 0, 127), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<int16, 8>(prng), 0, 255), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<int16, 9>(prng), 0, 511), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<int64, 1>(prng), 0, 1), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<int16>(prng, 7), 0, 127), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<int16>(prng, 8), 0, 255), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<int16>(prng, 9), 0, 511), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<int64>(prng, 1), 0, 1), true);
-
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<float>(prng, 0.0f, 1.0f), 0.0f, 1.0f), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<double>(prng, 0.0, 1.0), 0.0, 1.0), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<double>(prng, -1.0, 1.0), -1.0, 1.0), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<double>(prng, -1.0, 0.0), -1.0, 0.0), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<double>(prng, 1.0, 2.0), 1.0, 2.0), true);
-		VERIFY_EQUAL_QUIET_NONCONT(IsInRange(mpt::random<double>(prng, 1.0, 3.0), 1.0, 3.0), true);
-	}
-	#ifdef FLAKY_TESTS
 		{
 			std::vector<std::size_t> hist(256);
 			for(std::size_t i = 0; i < 256*256; ++i)
@@ -2609,245 +1647,6 @@
 static MPT_NOINLINE void TestCharsets()
 {
 
-	// MPT_UTF8 version
-
-	// Charset conversions (basic sanity checks)
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::UTF8, U_("a")), "a");
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::ISO8859_1, U_("a")), "a");
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::ASCII, U_("a")), "a");
-	VERIFY_EQUAL(mpt::ToUnicode(mpt::Charset::UTF8, "a"), U_("a"));
-	VERIFY_EQUAL(mpt::ToUnicode(mpt::Charset::ISO8859_1, "a"), U_("a"));
-	VERIFY_EQUAL(mpt::ToUnicode(mpt::Charset::ASCII, "a"), U_("a"));
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::Locale, U_("a")), "a");
-	VERIFY_EQUAL(mpt::ToUnicode(mpt::Charset::Locale, "a"), U_("a"));
-#endif
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::UTF8, MPT_UTF8("a")), "a");
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::ISO8859_1, MPT_UTF8("a")), "a");
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::ASCII, MPT_UTF8("a")), "a");
-	VERIFY_EQUAL(mpt::ToUnicode(mpt::Charset::UTF8, "a"), MPT_UTF8("a"));
-	VERIFY_EQUAL(mpt::ToUnicode(mpt::Charset::ISO8859_1, "a"), MPT_UTF8("a"));
-	VERIFY_EQUAL(mpt::ToUnicode(mpt::Charset::ASCII, "a"), MPT_UTF8("a"));
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::Locale, MPT_UTF8("a")), "a");
-	VERIFY_EQUAL(mpt::ToUnicode(mpt::Charset::Locale, "a"), MPT_UTF8("a"));
-#endif
-
-#if MPT_OS_EMSCRIPTEN
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::Locale, MPT_UTF8("\xe2\x8c\x82")), "\xe2\x8c\x82");
-#endif // MPT_OS_EMSCRIPTEN
-
-	// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
-	// We test german umlaut-a (U+00E4) (\xC3\xA4) and CJK U+5BB6 (\xE5\xAE\xB6)
-
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::ASCII,MPT_UTF8("abc\xC3\xA4xyz")),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::ISO8859_1,MPT_UTF8("abc\xC3\xA4xyz")),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::CP437,MPT_UTF8("abc\xC3\xA4xyz")),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::UTF8,MPT_UTF8("abc\xC3\xA4xyz")),"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::ASCII,MPT_UTF8("abc\xC3\xA4xyz")),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::ISO8859_1,MPT_UTF8("abc\xC3\xA4xyz")),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::CP437,MPT_UTF8("abc\xC3\xA4xyz")),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::UTF8,MPT_UTF8("abc\xC3\xA4xyz")),"abc"),true);
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::Locale,MPT_UTF8("abc\xC3\xA4xyz")),"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::Locale,MPT_UTF8("abc\xC3\xA4xyz")),"abc"),true);
-#endif
-
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::ASCII,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::ISO8859_1,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::CP437,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::UTF8,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::ASCII,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::ISO8859_1,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::CP437,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::UTF8,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"abc"),true);
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::Locale,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::Locale,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"abc"),true);
-#endif
-
-	VERIFY_EQUAL(EndsWith(mpt::ToUnicode(mpt::Charset::ASCII,"abc\xC3\xA4xyz"),U_("xyz")),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToUnicode(mpt::Charset::ISO8859_1,"abc\xC3\xA4xyz"),U_("xyz")),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToUnicode(mpt::Charset::CP437,"abc\xC3\xA4xyz"),U_("xyz")),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToUnicode(mpt::Charset::UTF8,"abc\xC3\xA4xyz"),U_("xyz")),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToUnicode(mpt::Charset::ASCII,"abc\xC3\xA4xyz"),U_("abc")),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToUnicode(mpt::Charset::ISO8859_1,"abc\xC3\xA4xyz"),U_("abc")),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToUnicode(mpt::Charset::CP437,"abc\xC3\xA4xyz"),U_("abc")),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToUnicode(mpt::Charset::UTF8,"abc\xC3\xA4xyz"),U_("abc")),true);
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(EndsWith(mpt::ToUnicode(mpt::Charset::Locale,"abc\xC3\xA4xyz"),U_("xyz")),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToUnicode(mpt::Charset::Locale,"abc\xC3\xA4xyz"),U_("abc")),true);
-#endif
-
-	VERIFY_EQUAL(EndsWith(mpt::ToUnicode(mpt::Charset::ASCII,"abc\xE5\xAE\xB6xyz"),U_("xyz")),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToUnicode(mpt::Charset::ISO8859_1,"abc\xE5\xAE\xB6xyz"),U_("xyz")),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToUnicode(mpt::Charset::CP437,"abc\xE5\xAE\xB6xyz"),U_("xyz")),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToUnicode(mpt::Charset::UTF8,"abc\xE5\xAE\xB6xyz"),U_("xyz")),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToUnicode(mpt::Charset::ASCII,"abc\xE5\xAE\xB6xyz"),U_("abc")),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToUnicode(mpt::Charset::ISO8859_1,"abc\xE5\xAE\xB6xyz"),U_("abc")),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToUnicode(mpt::Charset::CP437,"abc\xE5\xAE\xB6xyz"),U_("abc")),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToUnicode(mpt::Charset::UTF8,"abc\xE5\xAE\xB6xyz"),U_("abc")),true);
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(EndsWith(mpt::ToUnicode(mpt::Charset::Locale,"abc\xE5\xAE\xB6xyz"),U_("xyz")),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToUnicode(mpt::Charset::Locale,"abc\xE5\xAE\xB6xyz"),U_("abc")),true);
-#endif
-
-	// Check that characters are correctly converted
-	// We test german umlaut-a (U+00E4) and CJK U+5BB6
-
-	// cp437
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::CP437,MPT_UTF8("abc\xC3\xA4xyz")),"abc\x84xyz");
-	VERIFY_EQUAL(MPT_UTF8("abc\xC3\xA4xyz"),mpt::ToUnicode(mpt::Charset::CP437,"abc\x84xyz"));
-
-	// iso8859
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::ISO8859_1,MPT_UTF8("abc\xC3\xA4xyz")),"abc\xE4xyz");
-	VERIFY_EQUAL(MPT_UTF8("abc\xC3\xA4xyz"),mpt::ToUnicode(mpt::Charset::ISO8859_1,"abc\xE4xyz"));
-
-	// utf8
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::UTF8,MPT_UTF8("abc\xC3\xA4xyz")),"abc\xC3\xA4xyz");
-	VERIFY_EQUAL(MPT_UTF8("abc\xC3\xA4xyz"),mpt::ToUnicode(mpt::Charset::UTF8,"abc\xC3\xA4xyz"));
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::UTF8,MPT_UTF8("abc\xE5\xAE\xB6xyz")),"abc\xE5\xAE\xB6xyz");
-	VERIFY_EQUAL(MPT_UTF8("abc\xE5\xAE\xB6xyz"),mpt::ToUnicode(mpt::Charset::UTF8,"abc\xE5\xAE\xB6xyz"));
-
-
-#if MPT_WSTRING_CONVERT
-
-	// wide L"" version
-
-	// Charset conversions (basic sanity checks)
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::UTF8, L"a"), "a");
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::ISO8859_1, L"a"), "a");
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::ASCII, L"a"), "a");
-	VERIFY_EQUAL(mpt::ToWide(mpt::Charset::UTF8, "a"), L"a");
-	VERIFY_EQUAL(mpt::ToWide(mpt::Charset::ISO8859_1, "a"), L"a");
-	VERIFY_EQUAL(mpt::ToWide(mpt::Charset::ASCII, "a"), L"a");
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::Locale, L"a"), "a");
-	VERIFY_EQUAL(mpt::ToWide(mpt::Charset::Locale, "a"), L"a");
-#endif
-
-	// Check that some character replacement is done (and not just empty strings or truncated strings are returned)
-	// We test german umlaut-a (U+00E4) and CJK U+5BB6
-
-#if MPT_COMPILER_MSVC
-#pragma warning(push)
-#pragma warning(disable:4428) // universal-character-name encountered in source
-#endif
-
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::ASCII,L"abc\u00E4xyz"),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::ISO8859_1,L"abc\u00E4xyz"),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::CP437,L"abc\u00E4xyz"),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::UTF8,L"abc\u00E4xyz"),"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::ASCII,L"abc\u00E4xyz"),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::ISO8859_1,L"abc\u00E4xyz"),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::CP437,L"abc\u00E4xyz"),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::UTF8,L"abc\u00E4xyz"),"abc"),true);
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::Locale,L"abc\u00E4xyz"),"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::Locale,L"abc\u00E4xyz"),"abc"),true);
-#endif
-
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::ASCII,L"abc\u5BB6xyz"),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::ISO8859_1,L"abc\u5BB6xyz"),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::CP437,L"abc\u5BB6xyz"),"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::UTF8,L"abc\u5BB6xyz"),"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::ASCII,L"abc\u5BB6xyz"),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::ISO8859_1,L"abc\u5BB6xyz"),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::CP437,L"abc\u5BB6xyz"),"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::UTF8,L"abc\u5BB6xyz"),"abc"),true);
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(EndsWith(mpt::ToCharset(mpt::Charset::Locale,L"abc\u5BB6xyz"),"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToCharset(mpt::Charset::Locale,L"abc\u5BB6xyz"),"abc"),true);
-#endif
-
-	VERIFY_EQUAL(EndsWith(mpt::ToWide(mpt::Charset::ASCII,"abc\xC3\xA4xyz"),L"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToWide(mpt::Charset::ISO8859_1,"abc\xC3\xA4xyz"),L"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToWide(mpt::Charset::CP437,"abc\xC3\xA4xyz"),L"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToWide(mpt::Charset::UTF8,"abc\xC3\xA4xyz"),L"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToWide(mpt::Charset::ASCII,"abc\xC3\xA4xyz"),L"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToWide(mpt::Charset::ISO8859_1,"abc\xC3\xA4xyz"),L"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToWide(mpt::Charset::CP437,"abc\xC3\xA4xyz"),L"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToWide(mpt::Charset::UTF8,"abc\xC3\xA4xyz"),L"abc"),true);
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(EndsWith(mpt::ToWide(mpt::Charset::Locale,"abc\xC3\xA4xyz"),L"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToWide(mpt::Charset::Locale,"abc\xC3\xA4xyz"),L"abc"),true);
-#endif
-
-	VERIFY_EQUAL(EndsWith(mpt::ToWide(mpt::Charset::ASCII,"abc\xE5\xAE\xB6xyz"),L"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToWide(mpt::Charset::ISO8859_1,"abc\xE5\xAE\xB6xyz"),L"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToWide(mpt::Charset::CP437,"abc\xE5\xAE\xB6xyz"),L"xyz"),true);
-	VERIFY_EQUAL(EndsWith(mpt::ToWide(mpt::Charset::UTF8,"abc\xE5\xAE\xB6xyz"),L"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToWide(mpt::Charset::ASCII,"abc\xE5\xAE\xB6xyz"),L"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToWide(mpt::Charset::ISO8859_1,"abc\xE5\xAE\xB6xyz"),L"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToWide(mpt::Charset::CP437,"abc\xE5\xAE\xB6xyz"),L"abc"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToWide(mpt::Charset::UTF8,"abc\xE5\xAE\xB6xyz"),L"abc"),true);
-#if defined(MPT_ENABLE_CHARSET_LOCALE)
-	VERIFY_EQUAL(EndsWith(mpt::ToWide(mpt::Charset::Locale,"abc\xE5\xAE\xB6xyz"),L"xyz"),true);
-	VERIFY_EQUAL(BeginsWith(mpt::ToWide(mpt::Charset::Locale,"abc\xE5\xAE\xB6xyz"),L"abc"),true);
-#endif
-
-	// Check that characters are correctly converted
-	// We test german umlaut-a (U+00E4) and CJK U+5BB6
-
-	// cp437
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::CP437,L"abc\u00E4xyz"),"abc\x84xyz");
-	VERIFY_EQUAL(L"abc\u00E4xyz",mpt::ToWide(mpt::Charset::CP437,"abc\x84xyz"));
-
-	// iso8859
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::ISO8859_1,L"abc\u00E4xyz"),"abc\xE4xyz");
-	VERIFY_EQUAL(L"abc\u00E4xyz",mpt::ToWide(mpt::Charset::ISO8859_1,"abc\xE4xyz"));
-
-	// utf8
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::UTF8,L"abc\u00E4xyz"),"abc\xC3\xA4xyz");
-	VERIFY_EQUAL(L"abc\u00E4xyz",mpt::ToWide(mpt::Charset::UTF8,"abc\xC3\xA4xyz"));
-	VERIFY_EQUAL(mpt::ToCharset(mpt::Charset::UTF8,L"abc\u5BB6xyz"),"abc\xE5\xAE\xB6xyz");
-	VERIFY_EQUAL(L"abc\u5BB6xyz",mpt::ToWide(mpt::Charset::UTF8,"abc\xE5\xAE\xB6xyz"));
-
-#if MPT_COMPILER_MSVC
-#pragma warning(pop)
-#endif
-
-#endif
-
-	{
-		char buf[4] = { 'x','x','x','x' };
-		mpt::String::WriteAutoBuf(buf) = std::string("foobar");
-		VERIFY_EQUAL(buf[0], 'f');
-		VERIFY_EQUAL(buf[1], 'o');
-		VERIFY_EQUAL(buf[2], 'o');
-		VERIFY_EQUAL(buf[3], '\0');
-	}
-	{
-		char buf[4] = { 'x','x','x','x' };
-		char foobar[] = {'f','o','o','b','a','r','\0'};
-		mpt::String::WriteTypedBuf<std::string>(buf) = (char*)foobar;
-		VERIFY_EQUAL(buf[0], 'f');
-		VERIFY_EQUAL(buf[1], 'o');
-		VERIFY_EQUAL(buf[2], 'o');
-		VERIFY_EQUAL(buf[3], '\0');
-	}
-	{
-		char buf[4] = { 'x','x','x','x' };
-		mpt::String::WriteTypedBuf<std::string>(buf) = (const char*)"foobar";
-		VERIFY_EQUAL(buf[0], 'f');
-		VERIFY_EQUAL(buf[1], 'o');
-		VERIFY_EQUAL(buf[2], 'o');
-		VERIFY_EQUAL(buf[3], '\0');
-	}
-	{
-		char buf[4] = { 'x','x','x','x' };
-		mpt::String::WriteTypedBuf<std::string>(buf) = "foobar";
-		VERIFY_EQUAL(buf[0], 'f');
-		VERIFY_EQUAL(buf[1], 'o');
-		VERIFY_EQUAL(buf[2], 'o');
-		VERIFY_EQUAL(buf[3], '\0');
-	}
-	{
-		const char buf[4] = { 'f','o','o','b' };
-		std::string foo = mpt::String::ReadAutoBuf(buf);
-		VERIFY_EQUAL(foo, std::string("foob"));
-	}
-
 	// Path splitting
 
 #if MPT_OS_WINDOWS && defined(MPT_ENABLE_DYNBIND)
@@ -3116,7 +1915,6 @@
 #endif
 #endif
 
-
 	VERIFY_EQUAL(mpt::CompareNoCaseAscii("f", "f", 6) == 0, true);
 	VERIFY_EQUAL(mpt::CompareNoCaseAscii("f", "F", 6) == 0, true);
 	VERIFY_EQUAL(mpt::CompareNoCaseAscii("F", "f", 6) == 0, true);
@@ -3138,7 +1936,6 @@
 	VERIFY_EQUAL(mpt::CompareNoCaseAscii("FIH", "fghi", 1) == 0, true);
 	VERIFY_EQUAL(mpt::CompareNoCaseAscii("FIH", "fghi", 2) > 0, true);
 
-
 }
 
 
@@ -3179,63 +1976,6 @@
 #endif // MODPLUG_TRACKER
 
 
-static MPT_NOINLINE void TestCrypto()
-{
-
-#ifdef MODPLUG_TRACKER
-
-	mpt::crypto::hash::SHA512::result_type sha512_abc{
-		std::byte{0xdd},std::byte{0xaf},std::byte{0x35},std::byte{0xa1},std::byte{0x93},std::byte{0x61},std::byte{0x7a},std::byte{0xba},
-		std::byte{0xcc},std::byte{0x41},std::byte{0x73},std::byte{0x49},std::byte{0xae},std::byte{0x20},std::byte{0x41},std::byte{0x31},
-		std::byte{0x12},std::byte{0xe6},std::byte{0xfa},std::byte{0x4e},std::byte{0x89},std::byte{0xa9},std::byte{0x7e},std::byte{0xa2},
-		std::byte{0x0a},std::byte{0x9e},std::byte{0xee},std::byte{0xe6},std::byte{0x4b},std::byte{0x55},std::byte{0xd3},std::byte{0x9a},
-		std::byte{0x21},std::byte{0x92},std::byte{0x99},std::byte{0x2a},std::byte{0x27},std::byte{0x4f},std::byte{0xc1},std::byte{0xa8},
-		std::byte{0x36},std::byte{0xba},std::byte{0x3c},std::byte{0x23},std::byte{0xa3},std::byte{0xfe},std::byte{0xeb},std::byte{0xbd},
-		std::byte{0x45},std::byte{0x4d},std::byte{0x44},std::byte{0x23},std::byte{0x64},std::byte{0x3c},std::byte{0xe8},std::byte{0x0e},
-		std::byte{0x2a},std::byte{0x9a},std::byte{0xc9},std::byte{0x4f},std::byte{0xa5},std::byte{0x4c},std::byte{0xa4},std::byte{0x9f}
-	};
-	VERIFY_EQUAL(mpt::crypto::hash::SHA512().process(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(std::string("abc")))).result(), sha512_abc);
-
-	{
-
-		std::vector<std::byte> data = { std::byte{0x11}, std::byte{0x12}, std::byte{0x13}, std::byte{0x14} };
-
-		mpt::crypto::keystore keystore(mpt::crypto::keystore::domain::user);
-
-		mpt::crypto::asymmetric::rsassa_pss<>::managed_private_key key(keystore, U_("OpenMPT Test Key 1"));
-
-		auto publickeydata = key.get_public_key_data();
-
-		mpt::crypto::asymmetric::rsassa_pss<>::public_key pk{publickeydata};
-		mpt::crypto::asymmetric::rsassa_pss<>::public_key pk_copy{pk};
-		mpt::ustring jwk = publickeydata.as_jwk();
-
-		std::vector<std::byte> signature = key.sign(mpt::as_span(data));
-		mpt::ustring jws = key.jws_sign(mpt::as_span(data));
-		mpt::ustring jws_compact = key.jws_compact_sign(mpt::as_span(data));
-
-		try
-		{
-			pk.verify(mpt::as_span(data), signature);
-			auto verifieddata1 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_verify(jws);
-			auto verifieddata2 = mpt::crypto::asymmetric::rsassa_pss<>::public_key(mpt::crypto::asymmetric::rsassa_pss<>::public_key_data::from_jwk(jwk)).jws_compact_verify(jws_compact);
-			VERIFY_EQUAL(true, true);
-			VERIFY_EQUAL(data, verifieddata1);
-			VERIFY_EQUAL(data, verifieddata2);
-		} catch(const mpt::crypto::asymmetric::signature_verification_failed &)
-		{
-			VERIFY_EQUAL(true, false);
-		}
-
-		key.destroy();
-
-	}
-
-#endif // MODPLUG_TRACKER
-
-}
-
-
 static MPT_NOINLINE void TestSettings()
 {
 
@@ -4635,15 +3375,7 @@
 #endif
 
 
-static MPT_NOINLINE void TestTunings()
-{
 
-	// nothing for now
-
-}
-
-
-
 static double Rand01()
 {
 	return mpt::random(*s_PRNG, 0.0, 1.0);
Index: test/TestToolsLib.cpp
===================================================================
--- test/TestToolsLib.cpp	(revision 14628)
+++ test/TestToolsLib.cpp	(working copy)
@@ -28,6 +28,77 @@
 namespace Test {
 
 
+
+void mpt_test_reporter::case_run(const mpt::source_location& loc)
+{
+	#if !MPT_OS_DJGPP
+		std::cout << "TEST..: " << MPT_FORMAT("{}({}):")(loc.file_name() ? loc.file_name() : "", loc.line()) << ": " << std::endl;
+	#endif
+}
+
+void mpt_test_reporter::case_run(const mpt::source_location& loc, const char* text_e)
+{
+	#if !MPT_OS_DJGPP
+		std::cout << "TEST..: " << MPT_FORMAT("{}({}): {}")(loc.file_name() ? loc.file_name() : "", loc.line(), text_e) << ": " << std::endl;
+	#endif
+}
+
+void mpt_test_reporter::case_run(const mpt::source_location& loc, const char* text_ex, const char* text_e)
+{
+	if(text_ex)
+	{
+		#if !MPT_OS_DJGPP
+			std::cout << "TEST..: " << MPT_FORMAT("{}({}): {} throws {}")(loc.file_name() ? loc.file_name() : "", loc.line(), text_e, text_ex) << ": " << std::endl;
+		#endif
+	} else
+	{
+		#if !MPT_OS_DJGPP
+			std::cout << "TEST..: " << MPT_FORMAT("{}({}): {} throws")(loc.file_name() ? loc.file_name() : "", loc.line(), text_e) << ": " << std::endl;
+		#endif
+	}
+}
+
+void mpt_test_reporter::case_run(const mpt::source_location& loc, const char* text_a, const char* text_cmp, const char* text_b)
+{
+	#if !MPT_OS_DJGPP
+		std::cout << "TEST..: " << MPT_FORMAT("{}({}): {} {} {}")(loc.file_name() ? loc.file_name() : "", loc.line(), text_a, text_cmp, text_b) << ": " << std::endl;
+	#endif
+}
+
+void mpt_test_reporter::case_result(const mpt::source_location& loc, const mpt::test::result& result)
+{
+	MPT_UNUSED(loc);
+	if(std::holds_alternative<mpt::test::result_success>(result.info))
+	{
+		#if !MPT_OS_DJGPP
+			std::cout << "RESULT: PASS" << std::endl;
+		#endif
+	} else if(std::holds_alternative<mpt::test::result_failure>(result.info))
+	{
+		fail_count++;
+		std::cout << "RESULT: FAIL" << std::endl;
+		std::cout.flush();
+		std::cerr << "FAIL: " << "FAILURE: " << std::get<mpt::test::result_failure>(result.info).text << std::endl;
+		std::cerr.flush();
+	} else if(std::holds_alternative<mpt::test::result_unexpected_exception>(result.info))
+	{
+		fail_count++;
+		std::cout << "RESULT: FAIL" << std::endl;
+		std::cout.flush();
+		std::cerr << "FAIL: " << "UNEXPECTED EXCEPTION: " << std::get<mpt::test::result_unexpected_exception>(result.info).text << std::endl;
+		std::cerr.flush();
+	} else
+	{
+		fail_count++;
+		std::cout << "RESULT: FAIL" << std::endl;
+		std::cout.flush();
+		std::cerr << "FAIL: " << "UNKOWN" << std::endl;
+		std::cerr.flush();
+	}
+}
+
+
+
 int fail_count = 0;
 
 
Index: test/TestToolsLib.h
===================================================================
--- test/TestToolsLib.h	(revision 14628)
+++ test/TestToolsLib.h	(working copy)
@@ -21,6 +21,8 @@
 //#define MPT_TEST_CXX11
 
 
+#include "mpt/test/test.hpp"
+
 #include <type_traits>
 
 #include "../common/Endianness.h"
@@ -34,6 +36,23 @@
 namespace Test {
 
 
+
+class mpt_test_reporter
+	: public mpt::test::silent_reporter
+{
+public:
+	mpt_test_reporter() = default;
+	~mpt_test_reporter() override = default;
+public:
+	void case_run(const mpt::source_location & loc) override;
+	void case_run(const mpt::source_location & loc, const char * text_e) override;
+	void case_run(const mpt::source_location & loc, const char * text_ex, const char * text_e) override;
+	void case_run(const mpt::source_location & loc, const char * text_a, const char * text_cmp, const char * text_b) override;
+	void case_result(const mpt::source_location & loc, const mpt::test::result & result) override;
+};
+
+
+
 extern int fail_count;
 
 
Index: test/TestToolsTracker.h
===================================================================
--- test/TestToolsTracker.h	(revision 14628)
+++ test/TestToolsTracker.h	(working copy)
@@ -18,9 +18,12 @@
 #ifdef MODPLUG_TRACKER
 
 
+#include "mpt/test/test.hpp"
+
+
 OPENMPT_NAMESPACE_BEGIN
 
-	
+
 namespace Test {
 
 
@@ -32,6 +35,19 @@
 #endif
 
 
+class mpt_test_reporter
+	: public mpt::test::silent_reporter
+{
+public:
+	mpt_test_reporter() = default;
+	~mpt_test_reporter() override = default;
+public:
+	inline void immediate_breakpoint() override {
+		MyDebugBreak();
+	}
+};
+
+
 // Verify that given parameters are 'equal'. Break directly into the debugger if not.
 // The exact meaning of equality is based on operator== of the compared types.
 #define VERIFY_EQUAL(x,y)	\
